V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
nooper
V2EX  ›  Python

Python 性能的大杀器

  •  
  •   nooper · Jul 16, 2016 · 4844 views
    This topic created in 3573 days ago, the information mentioned may be changed or developed.

    from package import * especial in the __init__.py.

    这对包会深度递归。 会挨个遍历每一个__init__.py 。 性能会导致很慢。有些情况会导致循环引用以及外部变量不当。 居然有 2000 个行有这些代码。 其中还包含一些比较厉害的包。 声明__all__除外。

    18 replies    2016-07-18 16:41:21 +08:00
    Chichele
        1
    Chichele  
       Jul 16, 2016
    正常人不会这样做吧
    nooper
        2
    nooper  
    OP
       Jul 16, 2016
    --packages
    ---- __init__.py
    ---- a.py

    in a file

    ```python
    import pandas
    import numpy

    ```
    如果我在__init__.py

    from .a impot *
    这样会导致执行 import pandas, 和 import numpy
    如果导入会执行
    0.720189
    如果不导入
    0.001125000000000001
    julyclyde
        3
    julyclyde  
       Jul 16, 2016
    会遍历?
    nooper
        4
    nooper  
    OP
       Jul 16, 2016
    为啥我不能 append 呢?什么鬼。声明 all 也不例外。
    nooper
        5
    nooper  
    OP
       Jul 16, 2016
    import * 是个极大的败笔。导致了一堆副作用。
    9hills
        6
    9hills  
       Jul 16, 2016 via iPhone
    不会用怪败笔,呵呵
    nooper
        7
    nooper  
    OP
       Jul 16, 2016 via iPad
    @9hills 包太多了。大概是有几十个第三方包是不合规的。
    lhbc
        8
    lhbc  
       Jul 17, 2016
    Oracle, MSSQL, MySQL 性能大杀器
    select * from table where a like '%a%' and b like '%b%' and c like '%c%'
    chineselittleboy
        9
    chineselittleboy  
       Jul 17, 2016
    @lhbc 天呐 居然有*和 like~
    binux
        10
    binux  
       Jul 17, 2016
    from .a impot * 的时候, a 的脚本一定会被执行的,它的 global 变量有什么是确定的。即使 from .a impot b 也一样。
    而且 import 只加载一次,慢又有什么关系呢
    aec4d
        11
    aec4d  
       Jul 17, 2016
    import *对性能来说没有任何问题
    你可以看 werkzeug 的__init__.py 文件 搞什么 lazy loading 按需加载模块 官网都说了 并没有什么卵用
    import 一次之后就会有缓存 虽然 import *会导入很多模块 可是这点内存和时间损失都是微不足道的
    假如你用的是 from xxx import xxx 可是当你使用其他该库的模块的时候 因为模块相互调用 最后也和 import *是一样的

    不推荐使用 import * 不是因为性能问题 而是表意不明或者会污染命名空间 不要本末倒置了
    twl007
        12
    twl007  
       Jul 17, 2016 via iPhone
    python 自己不是有缓存么…… 有缓存的情况下不算是问题吧
    zhuangzhuang1988
        13
    zhuangzhuang1988  
       Jul 17, 2016
    @aec4d 你说的是长时间运行的程序当然没问题, 但是短暂的程序, 像写写代码再调试的话肯定受不了, 或者是 mercurial 这样的. 要是都 import 进来那每次运行一个命令还不玩死.
    所以 mercurial 专门有解决方法 https://selenic.com/hg/file/tip/mercurial/demandimport.py
    guyskk
        14
    guyskk  
       Jul 17, 2016
    @zhuangzhuang1988 命令行里用 from xxx import * 很常见吧,这点时间根本感觉不出来
    zhuangzhuang1988
        15
    zhuangzhuang1988  
       Jul 17, 2016
    @guyskk 嗯, 没说所有的都必须使用 lazy 技术, 简单的来说 你的 module 里加载太多, 比如里面还有个 time.sleep(1000), 但是实际上你这个模块根本没用到. 咋办...
    jjx
        16
    jjx  
       Jul 18, 2016
    除非你是 gui 程序, 注重首次启动的时间, 在服务端, 这个就不是问题
    nooper
        17
    nooper  
    OP
       Jul 18, 2016
    @jjx 对啊。就是很坑。
    cszhiyue
        18
    cszhiyue  
       Jul 18, 2016
    不要总想搞个大新闻
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   5982 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 152ms · UTC 06:25 · PVG 14:25 · LAX 23:25 · JFK 02:25
    ♥ Do have faith in what you're doing.