Pandas: PERF: импорт панд слишком медленный

Созданный на 30 мая 2014  ·  48Комментарии  ·  Источник: pandas-dev/pandas

Следующий тест демонстрирует проблему... содержимое testme.py буквально равно import pandas ; однако импорт панд на мой Lenovo T60 занимает почти 6 секунд.

[mpenning<strong i="8">@Mudslide</strong> panex]$ time python testme.py 

real    0m5.759s
user    0m5.612s
sys 0m0.120s
[mpenning<strong i="9">@Mudslide</strong> panex]$
[mpenning<strong i="10">@Mudslide</strong> panex]$ uname -a
Linux Mudslide 3.2.0-4-686-pae #1 SMP Debian 3.2.57-3+deb7u1 i686 GNU/Linux
[mpenning<strong i="11">@Mudslide</strong> panex]$ python -V
Python 2.7.3
[mpenning<strong i="12">@Mudslide</strong> panex]$
[mpenning<strong i="13">@Mudslide</strong> panex]$ pip freeze
Babel==1.3
Cython==0.20.1
Flask==0.10.1
Flask-Babel==0.8
Flask-Login==0.2.7
Flask-Mail==0.7.6
Flask-OpenID==1.1.1
Flask-SQLAlchemy==0.16
Flask-WTF==0.8.4
Flask-WhooshAlchemy==0.54a
Jinja2==2.7.1
MarkupSafe==0.18
Pygments==1.6
SQLAlchemy==0.7.9
Sphinx==1.2.2
Tempita==0.5.1
WTForms==1.0.5
Werkzeug==0.9.4
Whoosh==2.5.4
argparse==1.2.1
backports.ssl-match-hostname==3.4.0.2
blinker==1.3
ciscoconfparse==1.1.1
decorator==3.4.0
docutils==0.11
dulwich==0.9.6
## FIXME: could not find svn URL in dependency_links for this package:
flup==1.0.3.dev-20110405
hg-git==0.5.0
ipaddr==2.1.11
itsdangerous==0.23
matplotlib==1.3.1
mercurial==3.0
mock==1.0.1
nose==1.3.3
numexpr==2.4
numpy==1.8.1
numpydoc==0.4
pandas==0.13.1
pyparsing==2.0.2
python-dateutil==2.2
python-openid==2.2.5
pytz==2013b
six==1.6.1
speaklater==1.3
sqlalchemy-migrate==0.7.2
tables==3.1.1
tornado==3.2.1
wsgiref==0.1.2
Performance

Самый полезный комментарий

Пожалуйста, не игнорируйте этот вопрос. Он закрыт, но я также обнаружил проблемы с большой продолжительностью импорта. Возможно, его следует забрать. Создать осведомленность об этой проблеме и выше прио? В противном случае это не хорошо для популярности панд.

Все 48 Комментарий

звучит немного странно, у вас может быть проблема с путем. у вас установлено несколько питонов/сред? импорт numpy занимает столько же времени?

import pandas
pandas.show_versions()
time python testme.py
0.252u 0.076s 0:00.33 96.9%     0+0k 0+8io 1pf+0w
INSTALLED VERSIONS
------------------
commit: None
python: 2.7.3.final.0
python-bits: 64
OS: Linux
OS-release: 2.6.32-5-amd64
machine: x86_64
processor: 
byteorder: little
LC_ALL: None
LANG: en_US.UTF-8

pandas: 0.14.0rc1-43-g0dec048
nose: 1.3.0
Cython: 0.20
numpy: 1.8.1
scipy: 0.12.0
statsmodels: 0.5.0
IPython: 2.0.0
sphinx: 1.1.3
patsy: 0.1.0
scikits.timeseries: None
dateutil: 1.5
pytz: 2013b
bottleneck: 0.6.0
tables: 3.0.0
numexpr: 2.4
matplotlib: None
openpyxl: 1.5.7
xlrd: 0.9.0
xlwt: 0.7.4
xlsxwriter: None
lxml: 2.3.4
bs4: 4.1.3
html5lib: None
bq: None
apiclient: None
rpy2: None
sqlalchemy: 0.7.7
pymysql: None
psycopg2: 2.4.5 (dt dec pq3 ext)

numpy, похоже, не имеет этой проблемы...

[mpenning<strong i="6">@Mudslide</strong> pymtr]$ time python -c 'import numpy'

real    0m0.184s
user    0m0.136s
sys 0m0.048s
[mpenning<strong i="7">@Mudslide</strong> pymtr]$ time python -c 'import pandas'

real    0m5.724s
user    0m5.516s
sys 0m0.188s
[mpenning<strong i="8">@Mudslide</strong> pymtr]$

без понятия; Почему бы вам не попробовать виртуальную среду с установленными только пандами?

вы загружаете это по сети? попробуйте установить локально, распечатайте pd.__file__ , чтобы быть уверенным

закрытие как не ошибка.

У меня та же проблема. Это было закрыто, потому что вы нашли решение? Буду благодарен, если поделитесь. Спасибо.

@steve3141 steve3141 - вы пытались создать нетронутый виртуальный файл и посмотреть, поможет ли это?

Боюсь, я не могу; работа, изоляция и т. д. Итак, я понимаю, что это, скорее всего, не вина панд, за исключением того, что «импорт панд» выполняет огромное количество — по моим подсчетам, более 500 — вторичных операторов импорта. Накладные расходы файловой системы.

Спасибо,
Стив

От кого: Джефф Тратнер ( [email protected] )

Кому: pydata/pandas [email protected]
Копия: steve3141 [email protected]
Отправлено: 14 июля 2014 г., 17:00
Тема: Re: [pandas] PERF: импорт pandas идет слишком медленно (#7282)

@steve3141 steve3141 - вы пытались создать нетронутый виртуальный файл и посмотреть, поможет ли это?

Ответьте на это письмо напрямую или просмотрите его на GitHub.

Я знаю, что это было закрыто некоторое время, но я вижу то же самое, и это не относится к пандам. У нас есть среда pandas в virtualenv на диске на сервере. Затем этот диск монтируется каждым клиентом. Это позволяет нам поддерживать нормальную среду пакетов среди всех пользователей. Тем не менее, это явно приводит к неоправданной потере времени запуска. Время импорта в секундах следующее:

| Пакет | Сервер | Клиент |
| --- | --- | --- |
| панды | 1,22 | 6.23 |
| пустышка | .2 | 1.2 |

Итак, очевидно, что это проблема настройки, но как другие компании справляются с этой проблемой? Мне трудно поверить, что пакеты устанавливаются локально на компьютере каждого пользователя, а если это не так, то они испытывают такое долгое время запуска.

Сама сеть работает нормально...скорость передачи ~120 МБ/с.

@rockg - не знаю, как в каждой корпорации, но, конечно же, на всех установках, с которыми я работал, все было локально. Conda и tox могут значительно упростить локальную установку.

У меня та же проблема -> время импорта 6 с, локальная установка (anaconda, pandas '0.14.1). Это невероятно медленно, особенно при попытке импортировать несколько процессов.

Та же проблема (pandas 0.18), хотя моя не такая ужасная: 400 мс только до import pandas на локальном SSD. Я не могу себе представить, насколько это плохо для кого-то, кто использует, скажем, сетевую файловую систему.

+1. Я вижу где-то между 400-700 мс.

попробуйте удалить кеши шрифтов mpl. Или, если вы находитесь в такой заблокированной среде, что не можете записывать кеши, это может быть mpl, который ищет в вашей системе шрифты каждый раз, когда он импортируется.

(в python3/pandas 1.6.2 через анаконду)
В ipython очистка кеша matplotlib:

import shutil; import matplotlib
shutil.rmtree(matplotlib.get_cachedir())

---- перезагрузить айфон ----

%timeit -n1 -r1 import pandas

381 мс на линукс
748 мс на окнах
(это ничего не сделало)

импорт панд из ipython (300 мс) быстрее, чем запуск из python (500 мс)

Импорт некоторых зависимостей ускоряет импорт панд.

%timeit -n1 -r1 import pandas
375ms

--- перезапустить айфон -----

In [1]: %timeit -n1 -r1 import numpy
1 loops, best of 1: 87.8 ms per loop

In [2]: %timeit -n1 -r1 import pytz
1 loops, best of 1: 157 ms per loop

In [3]: %timeit -n1 -r1 import dateutil
1 loops, best of 1: 1.51 ms per loop

In [4]: %timeit -n1 -r1 import matplotlib
1 loops, best of 1: 54 ms per loop

In [5]: %timeit -n1 -r1 import xlsxwriter
1 loops, best of 1: 47.8 ms per loop

In [6]: %timeit -n1 -r1 import pandas
1 loops, best of 1: 177 ms per loop

Похоже, pytz особенно медленный

Получение всех модулей от pandas

Я удалил matplotlib, xlsxwriter и cython и импортировал суб-импорт pandas перед pandas (как видно через sys.modules.keys() ). Время импорта панд (запуск этих скриптов через интерпретатор) составило 100 мс после всех зависимых импортов вместо 500 мс:

import __future__
import __main__
import _ast
import _bisect
import _bootlocale
import _bz2
import _codecs
import _collections
import _collections_abc
import _compat_pickle
import _csv
import _ctypes
import _datetime
import _decimal
import _frozen_importlib
import _functools
import _hashlib
import _heapq
import _imp
import _io
import _json
import _locale
import _lzma
import _opcode
import _operator
import _pickle
import _posixsubprocess
import _random
import _sitebuiltins
import _socket
import _sre
import _ssl
import _stat
import _string
import _struct
import _sysconfigdata
import _thread
import _warnings
import _weakref
import _weakrefset
import abc
import argparse
import ast
import atexit
import base64
import binascii
import bisect
import builtins
import bz2
import calendar
import codecs
import collections
import contextlib
import copy
import copyreg
import csv
import ctypes
import datetime
import dateutil
import decimal
import difflib
import dis
import distutils
import email
import encodings
import enum
import errno
import fnmatch
import functools
import gc
import genericpath
import gettext
import grp
import hashlib
import heapq
import http
import importlib
import inspect
import io
import itertools
import json
import keyword
import linecache
import locale
import logging
import lzma
import marshal
import math
import numbers
import numexpr
import numpy
import opcode
import operator
import os
import parser
import pickle
import pkg_resources
import pkgutil
import platform
import plistlib
import posix
import posixpath
import pprint
import pwd
import pyexpat
import pytz
import quopri
import random
import re
import reprlib
import select
import selectors
import shutil
import signal
import site
import six
import socket
import sre_compile
import sre_constants
import sre_parse
import ssl
import stat
import string
import struct
import subprocess
import symbol
import sys
import sysconfig
import tarfile
import tempfile
import textwrap
import threading
import time
import timeit
import token
import tokenize
import traceback
import types
import unittest
import urllib
import uu
import uuid
import warnings
import weakref
import xml
import zipfile
import zipimport
import zlib

print(timeit.timeit('import pandas', number=1))

Обходной путь может состоять в том, чтобы стратифицировать этот импорт, прежде чем вам понадобятся панды.

Я получаю аналогичные результаты без anaconda/python2/pandas 1.8.

Аналогичная проблема для меня. Это делает разработку во Flask невыносимой, поскольку после каждого изменения файла для перезагрузки требуется 10 секунд. Я отладил его, время импорта 3-10 секунд, панды - главный виновник (2015 MBA), работающий с анакондой на 3.5.

Происходит какое-то кэширование, но не знаю, что...

python -m timeit -n1 -r1 «импорт панд»
1 петля, лучшая из 1: 3,71 сек на петлю
(abg) jacob@Jacobs-Air :~/stuff/abg% python -m timeit -n1 -r1 "импорт панд"
1 цикл, лучшее из 1: 652 мс на цикл

Один из способов обхода — изолировать весь код, взаимодействующий с pandas, и лениво импортировать этот код только тогда, когда он вам нужен, чтобы период ожидания был только во время выполнения программы. (это то, чем я занимаюсь)

Я не думаю, что это поможет - тогда у меня будет задержка при каждой перезагрузке.
(поскольку весь мой код работает с пандами).

Я сделал это в окне терминала:

'''
пока верно; do date && python -m timeit -n1 -r1 «импорт панд»; сон 2;
Готово;
'''

При этом панды остаются в кеше ОС. Глупый хак, но продолжает загружаться
до 300-500мс.

-J

В субботу, 7 января 2017 г., в 7:27, Брайс Гуинта, [email protected]
написал:

Один из способов обхода — изолировать весь код, взаимодействующий с pandas и
лениво импортируйте этот код только тогда, когда он вам нужен, чтобы период ожидания
только во время выполнения программы. (это то, чем я занимаюсь)


Вы получаете это, потому что вы прокомментировали.
Ответьте на это письмо напрямую, просмотрите его на GitHub
https://github.com/pandas-dev/pandas/issues/7282#issuecomment-271054552 ,
или заглушить тему
https://github.com/notifications/unsubscribe-auth/AAHchj5AFRzCAFrswjpTz1B7e0XM-mo1ks5rPvEDgaJpZM4B_lQ5
.

--
+919971876580
твиттер: @JacobSingh ( http://twitter.com/#!/JacobSingh )
Интернет: http://www.jacobsingh.name
Скайп: дизайн пижамы
gTalk: [email protected]

У меня похожая проблема. Работает на OSX и делает то же самое в virtualenv и вне его. Пробовал переустанавливать все, не помогло. Кажется, это не matplotlib, так как он относительно быстр сам по себе. Очень сложно решить эту проблему - кажется, ничего не отображается в журналах.

Может ли кто-нибудь профилировать простой «импорт панд», и мы сможем увидеть, легко ли определяется проблема?

Итак, я сделал быстрый профиль и нашел следующее:

         93778 function calls (91484 primitive calls) in 4.278 seconds

   Ordered by: internal time

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        6    0.426    0.071    0.905    0.151 api.py:3(<module>)
        1    0.306    0.306    4.276    4.276 __init__.py:5(<module>)
        1    0.189    0.189    0.211    0.211 base.py:1(<module>)
        1    0.163    0.163    0.426    0.426 api.py:1(<module>)
        1    0.129    0.129    1.170    1.170 format.py:5(<module>)
        2    0.121    0.061    0.197    0.099 base.py:3(<module>)
       20    0.120    0.006    0.390    0.019 __init__.py:1(<module>)
        3    0.119    0.040    0.178    0.059 common.py:1(<module>)
        1    0.115    0.115    0.572    0.572 __init__.py:26(<module>)
        1    0.112    0.112    0.569    0.569 frame.py:10(<module>)
        1    0.111    0.111    0.214    0.214 httplib.py:67(<module>)
        2    0.103    0.051    0.630    0.315 index.py:2(<module>)
        1    0.089    0.089    0.144    0.144 parser.py:29(<module>)
        1    0.078    0.078    0.084    0.084 excel.py:3(<module>)
        1    0.074    0.074    0.840    0.840 api.py:5(<module>)
        1    0.072    0.072    0.091    0.091 sparse.py:4(<module>)
        1    0.070    0.070    0.149    0.149 gbq.py:1(<module>)
        1    0.070    0.070    0.650    0.650 groupby.py:1(<module>)
        1    0.068    0.068    0.138    0.138 generic.py:2(<module>)
        1    0.063    0.063    1.265    1.265 config_init.py:11(<module>)
        1    0.060    0.060    0.060    0.060 socket.py:45(<module>)
        1    0.055    0.055    0.145    0.145 eval.py:4(<module>)
        1    0.054    0.054    0.075    0.075 expr.py:2(<module>)
        2    0.052    0.026    0.069    0.035 __init__.py:9(<module>)
        1    0.052    0.052    0.054    0.054 pytables.py:4(<module>)
        1    0.052    0.052    0.165    0.165 series.py:3(<module>)

Похоже, что инициализация в строке 5 занимает большую часть времени - это основная инициализация панд?

просто для сравнения на osx.

# 2.7
bash-3.2$ ~/miniconda3/envs/py2.7/bin/python -m timeit -n1 -r1 "import numpy"
1 loops, best of 1: 287 msec per loop
bash-3.2$ ~/miniconda3/envs/py2.7/bin/python -m timeit -n1 -r1 "import pandas"
1 loops, best of 1: 671 msec per loop

# 3.5
bash-3.2$ ~/miniconda3/envs/pandas/bin/python -m timeit -n1 -r1 "import numpy"
1 loops, best of 1: 168 msec per loop
bash-3.2$ ~/miniconda3/envs/pandas/bin/python -m timeit -n1 -r1 "import pandas"
1 loops, best of 1: 494 msec per loop

Кэш наверное?

Во вторник, 10 января 2017 г., в 21:56, Джефф Ребак, [email protected]
написал:

просто для сравнения на osx.

2,7

bash-3.2$ ~/miniconda3/envs/py2.7/bin/python -m timeit -n1 -r1 «импортировать numpy»
1 цикл, лучшее из 1: 287 мс на цикл
bash-3.2$ ~/miniconda3/envs/py2.7/bin/python -m timeit -n1 -r1 "импорт панд"
1 цикл, лучшее из 1: 671 мс на цикл

3,5

bash-3.2$ ~/miniconda3/envs/pandas/bin/python -m timeit -n1 -r1 "импортировать numpy"
1 цикл, лучшее из 1: 168 мс на цикл
bash-3.2$ ~/miniconda3/envs/pandas/bin/python -m timeit -n1 -r1 "импорт панд"
1 цикл, лучшее из 1: 494 мс на цикл


Вы получаете это, потому что вас упомянули.
Ответьте на это письмо напрямую, просмотрите его на GitHub
https://github.com/pandas-dev/pandas/issues/7282#issuecomment-271622897 ,
или заглушить тему
https://github.com/notifications/unsubscribe-auth/AAHchrtO89XXFLDcIdOvZzNQFEzSgmPrks5rQ7FOgaJpZM4B_lQ5
.

--
+919971876580
твиттер: @JacobSingh ( http://twitter.com/#!/JacobSingh )
Интернет: http://www.jacobsingh.name
Скайп: дизайн пижамы
gTalk: [email protected]

не уверен, что вы думаете, кешируется

@RexFuzzle Я удивлен, что у вас нет длинных имен файлов. Вы удалили каталоги? Вы должны увидеть что-то вроде показанного ниже. Так будет легче увидеть, что занимает большую часть времени. Я думаю, что все сводится к тому, что панды импортируют множество зависимостей, каждая из которых имеет свой собственный успех.

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.296    0.296    4.990    4.990 /mnt/environment/software/python/lib/python2.7/site-packages/pandas/__init__.py:3(<module>)
        1    0.198    0.198    0.331    0.331 /mnt/environment/software/python/lib/python2.7/site-packages/numpy/core/__init__.py:1(<module>)
        1    0.165    0.165    0.248    0.248 /mnt/environment/software/python/lib/python2.7/site-packages/bottleneck/__init__.py:3(<module>)
        1    0.154    0.154    0.164    0.164 /mnt/environment/software/python/lib/python2.7/site-packages/bs4/dammit.py:8(<module>)
        1    0.134    0.134    0.164    0.164 /mnt/environment/software/python/lib/python2.7/site-packages/pandas/core/common.py:3(<module>)

Хм, это странно - я ничего не удалял - использовал cProfile - не знаю, могло ли это быть причиной. Завтра буду исследовать это немного дальше. Судя по моим результатам, кажется, что это только одна инициализация, которая занимает все время - постараюсь получить мою в том же формате, что и у вас, а затем мы сможем сравнить - посмотреть, тот же ли это файл инициализации и номер строки.

Сохраните cprofile в файл, а затем загрузите его с помощью pstats и распечатайте. Если это конкретный модуль, запустите профилировщик строк, чтобы увидеть, есть ли в нем что-то конкретное или просто множество мелких вещей.

import cProfile
import pstats
cProfile.run("import pandas", "pandasImport")
p = pstats.Stats("pandasImport")
p.sort_stats("tottime").print_stats()

Для меня первая загрузка 4с. ОС кэширует библиотеку в памяти, поэтому
это около 300-500мс. Подождите немного и повторите попытку.

Лучший,
Джейкоб
Во вторник, 10 января 2017 г., в 22:42, Джефф Ребек, уведомления на адрес github.com
написал:

не уверен, что вы думаете, кешируется

--
+919971876580
твиттер: @JacobSingh ( http://twitter.com/#!/JacobSingh )
Интернет: http://www.jacobsingh.name
Скайп: дизайн пижамы
gTalk: [email protected]

Итак, работайте, как предложил @rockg :

Wed Jan 11 08:56:08 2017    pandasImport

         103330 function calls (100844 primitive calls) in 14.431 seconds

   Ordered by: internal time

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.701    0.701   14.432   14.432 /usr/local/lib/python2.7/site-packages/pandas/__init__.py:5(<module>)
        1    0.611    0.611    2.023    2.023 /usr/local/lib/python2.7/site-packages/numpy/core/__init__.py:1(<module>)
        1    0.575    0.575    1.420    1.420 /usr/local/lib/python2.7/site-packages/pandas/io/api.py:3(<module>)
        1    0.565    0.565    0.621    0.621 /usr/local/lib/python2.7/site-packages/pandas/indexes/base.py:1(<module>)
        1    0.563    0.563    3.323    3.323 /usr/local/lib/python2.7/site-packages/numpy/lib/__init__.py:1(<module>)
        1    0.393    0.393    0.394    0.394 /usr/local/lib/python2.7/site-packages/pandas/computation/engines.py:2(<module>)
        1    0.378    0.378    1.080    1.080 /usr/local/lib/python2.7/site-packages/pandas/indexes/api.py:1(<module>)
        1    0.313    0.313    1.991    1.991 /usr/local/lib/python2.7/site-packages/pandas/core/groupby.py:1(<module>)
        1    0.313    0.313    0.401    0.401 /usr/local/lib/python2.7/site-packages/numpy/polynomial/__init__.py:15(<module>)
        1    0.271    0.271    1.338    1.338 /usr/local/lib/python2.7/site-packages/pandas/compat/__init__.py:26(<module>)
        1    0.262    0.262    0.311    0.311 /usr/local/lib/python2.7/site-packages/pandas/core/sparse.py:4(<module>)
        1    0.246    0.246    0.246    0.246 /usr/local/lib/python2.7/site-packages/numpy/lib/npyio.py:1(<module>)
        1    0.240    0.240    0.493    0.493 /usr/local/Cellar/python/2.7.13/Frameworks/Python.framework/Versions/2.7/lib/python2.7/httplib.py:67(<module>)
        1    0.238    0.238    0.447    0.447 /usr/local/lib/python2.7/site-packages/numpy/testing/utils.py:4(<module>)
        1    0.238    0.238    2.684    2.684 /usr/local/lib/python2.7/site-packages/pandas/formats/format.py:5(<module>)
        1    0.221    0.221    0.271    0.271 /usr/local/lib/python2.7/site-packages/numpy/ma/__init__.py:41(<module>)
        1    0.220    0.220    2.976    2.976 /usr/local/lib/python2.7/site-packages/pandas/core/config_init.py:11(<module>)
        1    0.217    0.217    0.365    0.365 /usr/local/lib/python2.7/site-packages/pandas/core/base.py:3(<module>)
        1    0.215    0.215    4.526    4.526 /usr/local/lib/python2.7/site-packages/numpy/__init__.py:106(<module>)
        1    0.208    0.208    0.425    0.425 /usr/local/lib/python2.7/site-packages/pandas/core/generic.py:2(<module>)
        1    0.207    0.207    1.667    1.667 /usr/local/lib/python2.7/site-packages/pandas/core/frame.py:10(<module>)
        1    0.194    0.194    2.565    2.565 /usr/local/lib/python2.7/site-packages/pandas/core/api.py:5(<module>)
        1    0.192    0.192    0.194    0.194 /usr/local/lib/python2.7/site-packages/pandas/io/pytables.py:4(<module>)
        1    0.182    0.182    0.307    0.307 /usr/local/lib/python2.7/site-packages/pytz/__init__.py:9(<module>)
        1    0.173    0.173    0.374    0.374 /usr/local/lib/python2.7/site-packages/pandas/io/common.py:1(<module>)
        1    0.167    0.167    0.337    0.337 /usr/local/lib/python2.7/site-packages/pandas/stats/api.py:3(<module>)
        1    0.161    0.161    0.167    0.167 /usr/local/lib/python2.7/site-packages/pandas/io/excel.py:3(<module>)
        1    0.160    0.160    0.330    0.330 /usr/local/lib/python2.7/site-packages/numpy/core/numeric.py:1(<module>)
        1    0.159    0.159    0.160    0.160 /usr/local/lib/python2.7/site-packages/numpy/random/__init__.py:88(<module>)
        1    0.158    0.158    0.204    0.204 /usr/local/lib/python2.7/site-packages/pandas/computation/expr.py:2(<module>)
        1    0.150    0.150    0.232    0.232 /usr/local/lib/python2.7/site-packages/pandas/tseries/frequencies.py:1(<module>)

Хорошо, давайте сделаем еще один шаг и создадим линейный профиль pandas.__init__ . Вы можете сделать это с помощью line_profiler .

Может быть, вы могли бы также попробовать https://github.com/cournape/import-profiler

Но, глядя на приведенные выше значения, хотя время импорта намного больше, numpy также занимает гораздо больше времени. Соотношение импорта numpy к полному импорту pandas кажется таким же, как и для гораздо меньших чисел, опубликованных @jreback , или я также вижу). Так что, если numpy уже занимает более 4 секунд для импорта, мы, конечно, не получим время импорта pandas ниже этого.

Спасибо за ваш вклад. Тем временем я запустил dtruss и обнаружил, что ничего не происходит в течение нескольких секунд, прежде чем там что-то появляется, и поэтому я думаю, что при чтении диска возникает задержка, а не проблема с python, для меня это подкрепляется тем фактом, что время кажется сгруппированным с первой строкой файла инициализации (артефакт из cProfile?). Покопаюсь еще немного. Также согласитесь, что это, кажется, более тупая проблема, и мы рассмотрим их проблемы и посмотрим, есть ли у кого-нибудь что-то подобное.
Еще раз спасибо за вклад.

Также согласитесь, что это больше проблема с numpy

Извините, это не то, что я хотел сказать. Я просто имел в виду, что и numpy, и pandas, похоже, занимают больше времени (по сравнению с моим ноутбуком, оба раза в 10–15 раз дольше), так что не обязательно точно указывать на определенный импорт, который является виновником. Просто кажется, что он медленнее. Это, конечно, не означает, что мы могли бы сделать еще несколько ленивых импортов в pandas, чтобы улучшить ситуацию, если есть узкие места.

Пожалуйста, не игнорируйте этот вопрос. Он закрыт, но я также обнаружил проблемы с большой продолжительностью импорта. Возможно, его следует забрать. Создать осведомленность об этой проблеме и выше прио? В противном случае это не хорошо для популярности панд.

Я хочу и могу провести дополнительное тестирование, но я не знаю других тестов типа профиля, которые я могу запустить, чтобы попытаться найти источник, поэтому я открыт для предложений.

Привет,

При использовании панд с не такими большими наборами данных для анализа всех данных и построения графика потребуется не менее 5–10 секунд, что довольно долго.
Итак, шаги, которые привели меня к медленному выполнению панд в pycharm, были такими:

  1. Установка Anaconda для всех пользователей
  2. Установка Python 3.6.1

Итак, поскольку это было ненормальное количество времени для выполнения небольшого кода, я решил удалить как Anaconda, так и Python 3.6.1 и предпринять дополнительные шаги:

  1. Установите Visualcppbuildtoolsfull (его можно найти здесь: http://landinghub.visualstudio.com/visual-cpp-build-tools)
  2. Установка Python 3.6.1
  3. Установка Anaconda для всех пользователей
  4. Настройки Pycharm по умолчанию> Интерпретатор проекта> Выберите правильный (общий python 3.6.1 или Anaconda), чтобы запросить все пакеты.
  5. (Необязательно) Я предлагаю выполнить шаг 4 для каждого пути, который обнаруживает pycharm.

Теперь выполнение кода происходит быстрее (намного быстрее, чем раньше).
Я надеюсь, что это поможет кому-то.

Я просто запустил то же, что предложил rockg, но отсортировал по cumtime , а не tottime , что сразу указывает на то, что модуль pytz занимает половину общего времени импорта (на моем ПК ). Есть ли способ сделать это необязательным или ленивым? Я редко использую дату и время, а если и использую, то почти всегда в формате UTC, поэтому часовые пояса меня мало интересуют.

То же самое с модулем pandas.plotting - у меня есть приложение, которое не рисует, поэтому воняет, что добавляет значительное время к моему импорту без какой-либо выгоды. Кажется, имеет смысл сделать это ленивым, поскольку matplotlib в любом случае занимает много времени, а дополнительные 0,15 с незаметны.


import cProfile
import pstats
cProfile.run("import pandas", "pandasImport")
p = pstats.Stats("pandasImport")
p.sort_stats("cumtime").print_stats()

который печатает (вещи ниже 0,1 секунды исключены)

Mon Oct 23 14:01:19 2017    pandasImport

         204659 function calls (202288 primitive calls) in 1.875 seconds

   Ordered by: cumulative time

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.042    0.042    1.876    1.876 c:\app\python\anaconda\1.6.0\lib\site-packages\pandas\__init__.py:5(<module>)
   321/44    0.041    0.000    1.156    0.026 {__import__}
        1    0.008    0.008    0.925    0.925 c:\app\python\anaconda\1.6.0\lib\site-packages\pytz\__init__.py:9(<module>)
        1    0.002    0.002    0.914    0.914 c:\app\python\anaconda\1.6.0\lib\site-packages\pkg_resources.py:14(<module>)
        1    0.000    0.000    0.651    0.651 c:\app\python\anaconda\1.6.0\lib\site-packages\pkg_resources.py:704(subscribe)
      217    0.000    0.000    0.650    0.003 c:\app\python\anaconda\1.6.0\lib\site-packages\pkg_resources.py:2870(<lambda>)
      217    0.001    0.000    0.650    0.003 c:\app\python\anaconda\1.6.0\lib\site-packages\pkg_resources.py:2299(activate)
      427    0.002    0.000    0.602    0.001 c:\app\python\anaconda\1.6.0\lib\site-packages\pkg_resources.py:1845(_handle_ns)
      217    0.001    0.000    0.586    0.003 c:\app\python\anaconda\1.6.0\lib\site-packages\pkg_resources.py:1898(fixup_namespace_packages)
      411    0.003    0.000    0.581    0.001 c:\app\python\anaconda\1.6.0\lib\pkgutil.py:176(find_module)
      411    0.571    0.001    0.571    0.001 {imp.find_module}
        1    0.011    0.011    0.423    0.423 c:\app\python\anaconda\1.6.0\lib\site-packages\pandas\core\api.py:5(<module>)
        1    0.007    0.007    0.352    0.352 c:\app\python\anaconda\1.6.0\lib\site-packages\pandas\core\groupby.py:1(<module>)
       40    0.001    0.000    0.248    0.006 c:\app\python\anaconda\1.6.0\lib\site-packages\pkg_resources.py:444(add_entry)
      472    0.005    0.000    0.236    0.001 c:\app\python\anaconda\1.6.0\lib\site-packages\pkg_resources.py:1779(find_on_path)
        1    0.005    0.005    0.231    0.231 c:\app\python\anaconda\1.6.0\lib\site-packages\pandas\core\frame.py:10(<module>)
      472    0.188    0.000    0.188    0.000 {nt._isdir}
      476    0.002    0.000    0.187    0.000 {map}
        1    0.023    0.023    0.173    0.173 c:\app\python\anaconda\1.6.0\lib\site-packages\numpy\__init__.py:106(<module>)
        1    0.003    0.003    0.157    0.157 c:\app\python\anaconda\1.6.0\lib\site-packages\pandas\core\series.py:3(<module>)
        1    0.005    0.005    0.142    0.142 c:\app\python\anaconda\1.6.0\lib\site-packages\pandas\plotting\__init__.py:3(<module>)
        1    0.008    0.008    0.132    0.132 c:\app\python\anaconda\1.6.0\lib\site-packages\pandas\plotting\_converter.py:1(<module>)
        1    0.000    0.000    0.127    0.127 c:\app\python\anaconda\1.6.0\lib\site-packages\pkg_resources.py:430(__init__)
        1    0.003    0.003    0.119    0.119 c:\app\python\anaconda\1.6.0\lib\site-packages\numpy\add_newdocs.py:10(<module>)
        1    0.019    0.019    0.115    0.115 c:\app\python\anaconda\1.6.0\lib\site-packages\numpy\lib\__init__.py:1(<module>)
        1    0.002    0.002    0.109    0.109 c:\app\python\anaconda\1.6.0\lib\site-packages\pandas\util\_tester.py:3(<module>)
        1    0.015    0.015    0.107    0.107 c:\app\python\anaconda\1.6.0\lib\site-packages\pytest.py:4(<module>)
        1    0.005    0.005    0.102    0.102 c:\app\python\anaconda\1.6.0\lib\site-packages\pandas\core\index.py:2(<module>)

К сведению: у меня на ПК есть SSD, поэтому, если есть проблема с поиском диска, которая возникает у некоторых людей, я ее не вижу. numpy 1.12 импортирует 0,17 секунды.

@jason-s pytz импортирует на моей машине менее 5 микросекунд, так что здесь что-то странное.

FYI #17710 немного поработал над этим, так что в предстоящем релизе все должно быть быстрее (хотя ничего не касается pytz).

Я использую pandas 0.20.2 с pytz 2016.4 на компьютере с Windows 7 под управлением Anaconda Python 2.7.

Я только что запустил conda uninstall pytz и переустановил его, теперь это занимает 0,01 секунды с pytz-2017.2.

Переустановил pytz 2016.4 (conda install pytz=2016.4), и он снова замедлился до 0,92 секунды.

Установил pytz 2016.7 -- тоже очень быстро (13 миллисекунд на импорт). В данных профиля есть элемент под названием «lazy.py», который звучит так, как будто они перешли на «ленивую» загрузку в 2016.7.

import cProfile
import pstats
cProfile.run("import pytz", "profiling_data")
p = pstats.Stats("profiling_data")
p.sort_stats("cumtime").print_stats()

который печатает это для pytz 2016.7:

ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.005    0.005    0.018    0.018 <string>:1(<module>)
        1    0.008    0.008    0.013    0.013 c:\app\python\anaconda\1.6.0\lib\site-packages\pytz\__init__.py:9(<module>)
        2    0.002    0.001    0.002    0.001 c:\app\python\anaconda\1.6.0\lib\site-packages\pytz\lazy.py:135(__new__)
        1    0.002    0.002    0.002    0.002 c:\app\python\anaconda\1.6.0\lib\site-packages\pytz\tzinfo.py:1(<module>)
        1    0.000    0.000    0.001    0.001 c:\app\python\anaconda\1.6.0\lib\site-packages\pytz\lazy.py:1(<module>)
        1    0.000    0.000    0.000    0.000 c:\app\python\anaconda\1.6.0\lib\site-packages\pytz\tzfile.py:4(<module>)
        2    0.000    0.000    0.000    0.000 c:\app\python\anaconda\1.6.0\lib\site-packages\pytz\lazy.py:80(__new__)

Хм. к сожалению, переход на pytz 2017.2 (или 2016.7), похоже, не ускоряет импорт панд; Похоже, что либо между ними существует много общих зависимостей, либо во время процесса pandas __init__ он использует pytz и сводит на нет преимущество в скорости, которое импорт pytz обеспечивает за счет ленивой инициализации.

О, поехали, оба используют pkg_resources.py, который на моем ПК занимает около 0,9 с, чтобы выполнить все, что он делает, будь то из pytz или pandas.

У меня были setuptools 27.2 (включая pkg_resources); похоже, это связано с этой проблемой https://github.com/pypa/setuptools/issues/926

Хорошо, я использовал ripgrep в своих пакетах сайтов для поиска pkg_resources, и виновниками являются pytz (который теперь использует его лениво) и numexpr.

Я зарегистрировал проблему с numexpr.

Является ли numexpr ленивым импортом в pandas в предстоящем выпуске? Это еще одна область, где функция, которую я никогда не использую (по крайней мере, я думаю, что никогда ее не использую), значительно замедляет импорт панд.

редактировать: неважно, вы уже знаете об этом:

https://github.com/pandas-dev/pandas/pull/17710#issuecomment -332952362

Для справки, вот профиль импорта с использованием Python 3.7 importtime и tuna :

python3.7 -X importtime -c "import pandas" 2> pandas.log
tuna pandas.log

pandas

Наше решение состоит в том, чтобы настроить веб-сервер и использовать почтовый запрос к части алгоритма, и время для импорта пакета «панды» может быть сокращено.

здесь такая же проблема

python -m timeit -n1 -r1 «импорт панд»
1 петля, лучшая из 1: 8,56 сек на петлю

Не стесняйтесь делать PR, если вы найдете простые решения.

В среду, 28 ноября 2018 г., в 16:41 [email protected] написал:

здесь такая же проблема

python -m timeit -n1 -r1 «импорт панд»
1 петля, лучшая из 1: 8,56 сек на петлю


Вы получаете это, потому что вы прокомментировали.
Ответьте на это письмо напрямую, просмотрите его на GitHub
https://github.com/pandas-dev/pandas/issues/7282#issuecomment-442633080 ,
или заглушить тему
https://github.com/notifications/unsubscribe-auth/ABQHIix6pTkeFPbLXh1GHnWwM8L_y4ceks5uzxD9gaJpZM4B_lQ5
.

Так что я думаю, что, возможно, нашел эту проблему. Более 50% моего времени занимает один вызов одной функции: mkl._py_mkl_service.get_version

pandasимпорт

     187472 function calls (181157 primitive calls) in 4.406 seconds

Упорядочено по: внутреннему времени

ncalls tottime percall cumtime percall имя файла:lineno (функция)
1 2.295 2.295 2.295 2.295 {встроенный метод mkl._py_mkl_service.get_version}

Код

import cProfile
import pstats
cProfile.run("import pandas", "pandasImport")
p = pstats.Stats("pandasImport")
p.sort_stats("tottime").print_stats()

pandas.show_versions()

INSTALLED VERSIONS
------------------
commit           : f2ca0a2665b2d169c97de87b8e778dbed86aea07
python           : 3.7.4.final.0
python-bits      : 64
OS               : Windows
OS-release       : 10
Version          : 10.0.18362
machine          : AMD64
processor        : Intel64 Family 6 Model 142 Stepping 10, GenuineIntel
byteorder        : little
LC_ALL           : None
LANG             : None
LOCALE           : None.None

pandas           : 1.1.1
numpy            : 1.19.1
pytz             : 2020.1
dateutil         : 2.8.1
pip              : 20.2.2
setuptools       : 49.6.0.post20200814
Cython           : 0.29.21
pytest           : 6.0.2
hypothesis       : 5.35.3
sphinx           : 2.2.0
blosc            : None
feather          : None
xlsxwriter       : 1.3.3
lxml.etree       : 4.5.2
html5lib         : 1.1
pymysql          : None
psycopg2         : None
jinja2           : 2.11.2
IPython          : 7.18.1
pandas_datareader: None
bs4              : 4.9.1
bottleneck       : 1.3.2
fsspec           : 0.8.0
fastparquet      : None
gcsfs            : None
matplotlib       : 3.3.1
numexpr          : 2.7.1
odfpy            : None
openpyxl         : 3.0.5
pandas_gbq       : None
pyarrow          : None
pytables         : None
pyxlsb           : None
s3fs             : None
scipy            : 1.5.2
sqlalchemy       : 1.3.19
tables           : 3.6.1
tabulate         : None
xarray           : None
xlrd             : 1.2.0
xlwt             : 1.3.0
numba            : 0.51.2
Была ли эта страница полезной?
0 / 5 - 0 рейтинги