V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
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
decken
V2EX  ›  Python

Win 与 Linux 下 python 效率问题

  •  
  •   decken ·
    DecKen · 2014-05-07 20:36:22 +08:00 · 7903 次点击
    这是一个创建于 3860 天前的主题,其中的信息可能已经有所发展或是发生改变。
    import time

    t1 = time.time()
    for i in range(10000000):
    框框pass
    t2 = time.time()
    print ("process %s seconds" %(t2 - t1))

    这段代码很简单,就是空循环一千万次

    在3部不同机器运行,都是python2.7
    戴尔服务器,64G内存,8核CPU,操作系统:debian 64bit(挺牛逼的)
    运行时间:1.09349584579 seconds

    联想服务器,4G内存,双核CPU,操作系统:ubuntu12.04 64bit
    运行时间:1.10862994194 seconds

    普通PC机,2G内存,I3CPU,操作系统:Win7 64(很屌丝了吧)
    运行时间:0.648999929428 seconds

    为什么差别这么大呢?这是因为不同平台解析器不同的原因造成的吗?
    第 1 条附言  ·  2014-05-07 22:13:35 +08:00
    第一部cpu主频为2.4GHz
    第二部cpu主频为2.0GHz
    第三部cpu主频为3.3GHz
    44 条回复    2016-12-04 23:44:14 +08:00
    xdeng
        1
    xdeng  
       2014-05-07 20:40:52 +08:00
    被优化掉了吧
    FarBox
        2
    FarBox  
       2014-05-07 20:45:41 +08:00
    但是,你这段代码,跟你的核数,内存大小,都没有直接的关联呀……
    Ever
        3
    Ever  
       2014-05-07 20:45:50 +08:00
    windows下面用time.clock()
    glasslion
        4
    glasslion  
       2014-05-07 20:53:45 +08:00
    @FarBox 和内存有关联, range(10000000) 占的内存不小了
    min
        5
    min  
       2014-05-07 20:55:18 +08:00
    内存 cpu os 各不相同,硬拉到一起准备做转基因杂交试验么?
    stackpop
        6
    stackpop  
       2014-05-07 20:56:23 +08:00
    @glasslion 求解这一句怎么个占内存法
    66CCFF
        7
    66CCFF  
       2014-05-07 21:07:25 +08:00
    @stackpop 会生成一个(0 - 10000000)的表出来。。。如果不用xrange的话
    decken
        8
    decken  
    OP
       2014-05-07 21:10:04 +08:00
    @Ever 用了 结果是:0.659124743394 seconds
    decken
        9
    decken  
    OP
       2014-05-07 21:13:19 +08:00
    @FarBox 想不明白的是屌丝机居然比高端服务器运行这段程序还快

    @min 像戴尔的和普通机配置悬殊,但是差的反而快,这就奇怪了.
    cevincheung
        10
    cevincheung  
       2014-05-07 21:19:52 +08:00
    所以要升级到python3。 128内存,单核cpu虚拟机0.6s
    decken
        11
    decken  
    OP
       2014-05-07 21:20:52 +08:00
    @cevincheung 3不是出了名的慢吗?
    phyng
        12
    phyng  
       2014-05-07 21:21:32 +08:00
    i3-3110M/8G RAM/SSD/Win 8.1 64bit

    Python 2.7.6 (default, Nov 10 2013, 19:24:24) [MSC v.1500 64 bit (AMD64)] on win32
    ~1.5s

    Python 3.4.0 (v3.4.0:04f714765c13, Mar 16 2014, 19:25:23) [MSC v.1600 64 bit (AMD64)] on win32
    ~1.3s

    难道因为我是笔记本= =!
    测试表明,Python3性能比Python2好15%?
    glasslion
        13
    glasslion  
       2014-05-07 21:21:39 +08:00
    @decken 谁告诉你3慢的?
    kemad
        14
    kemad  
       2014-05-07 21:22:48 +08:00 via iPhone
    看这个代码,用不到多少内存,估计是只跑在一个CPU的一个核,那比的就是cpu主频。

    服务器的主频确实有可能比普通台式的低。

    你用这个代码来跑测试,意义真不大。
    phyng
        15
    phyng  
       2014-05-07 21:26:25 +08:00
    我把笔记本从节能模式改成高性能
    Python2 ~0.8s
    Python3 ~0.7s
    66CCFF
        16
    66CCFF  
       2014-05-07 21:27:57 +08:00
    @decken 改用xrange()的话,linux快了很多。
    我的结果:python version 2.7.6
    i7 3640qm 8g 内存的机器: range() 0.58s xrange 0.41s

    linux version 2.7.3
    E3 3.3Ghz Ramnode openvz 128m ram range() 0.91s xrange() 0.33s

    Unknown Xeon 2.3Ghz DigitalOcean Kvm 2G RAM range() 1.2s xrange() 0.8s
    66CCFF
        17
    66CCFF  
       2014-05-07 21:30:51 +08:00
    顺带一提我的笔记主频一般睿频是到 3.2Ghz。
    看起来最后和cpu主频关系确实很大。
    phyng
        18
    phyng  
       2014-05-07 21:39:19 +08:00   ❤️ 1
    恰恰相反,主机win8 Python2/3 64bit分别要~0.8s ~0.7s,同一台电脑的虚拟机Ubuntu 64bit只需要~0.6s ~0.5s
    lynx
        19
    lynx  
       2014-05-07 21:40:07 +08:00
    测试代码单线程的,也用不了多少内存
    时间的长度跟CPU单核性能有关,其他关系不大
    decken
        20
    decken  
    OP
       2014-05-07 22:17:56 +08:00
    @lynx
    @66CCFF
    第一部cpu主频为2.4GHz
    第二部cpu主频为2.0GHz
    第三部cpu主频为3.3GHz

    第二部比第一部主频低,购买的年代第二部比第一部早2 3年吧,但是第二部和第一部差别不是很明显
    decken
        21
    decken  
    OP
       2014-05-07 22:20:14 +08:00
    @glasslion 很多人不喜欢用3的原因不就是因为3的效率比较低吗
    kchum
        22
    kchum  
       2014-05-07 22:29:37 +08:00
    @decken 那是某些库不兼容的缘故。
    glasslion
        23
    glasslion  
       2014-05-07 22:34:30 +08:00
    @decken 哪儿听来的? Python3 的benchmark 从来都是 领先于 Python2
    clino
        24
    clino  
       2014-05-07 22:36:40 +08:00
    我的是双核: Intel(R) Core(TM)2 Duo CPU P8700 @ 2.53GHz
    linux python2.7.3
    process 0.477319955826 seconds
    ericls
        25
    ericls  
       2014-05-07 22:43:32 +08:00
    time()在windows和linux下不一样
    loading
        26
    loading  
       2014-05-07 22:46:26 +08:00 via Android
    @decken 233
    cevincheung
        27
    cevincheung  
       2014-05-07 23:06:51 +08:00
    @decken 我是因为,3相对于2来说语法变动略大- -#
    openroc
        28
    openroc  
       2014-05-07 23:08:50 +08:00
    上pypy吧,
    wenbinwu
        29
    wenbinwu  
       2014-05-07 23:11:58 +08:00
    process 1.16248011589 seconds
    在虚拟机里 ubuntu
    VYSE
        30
    VYSE  
       2014-05-07 23:19:09 +08:00
    其实GCC效率很差的
    GCC RANGE:
    process 1.03287792206 seconds
    GCC XRANGE:
    process 0.60715007782 seconds

    换ICC版PYTHON
    ICC RANGE:
    process 0.879615068436 seconds
    ICC XRANGE:
    process 0.418220996857 seconds

    放在同一个CPU下面才有意义,另一个I5 CPU.
    WIN ICC PYTHON:
    RANGE: process 0.53400015831 seconds
    XRANGE: process 0.319999933243 seconds

    UBUNTU GCC PYTHON:
    RANGE:process 0.702558994293 seconds
    XRANGE:process 0.412276983261 seconds

    RHEL ICC PYTHON:
    RANGE:process 0.522276163101 seconds
    XRANGE:process 0.270608901978 seconds

    WIN和LINUX实际差距也只在malloc可能会有差距(WIN稍慢)。
    那么GCC和其他编译器相比甚至微软的,就不多说了
    wy315700
        31
    wy315700  
       2014-05-08 07:30:59 +08:00
    我估计是不同的内存带宽带来的影响
    zxy
        32
    zxy  
       2014-05-08 08:18:38 +08:00
    第一部 dell 服务器 因为内存的原因说牛逼,我不认为。。
    ericls
        33
    ericls  
       2014-05-08 08:49:33 +08:00
    i3 1.9Ghz 4G内存 实测

    0.408885002136s
    ericls
        34
    ericls  
       2014-05-08 08:51:28 +08:00
    i3 1.9GHz 4G内存 ubuntu 64bit 改用xrange 实测

    0.213598012924s
    decken
        35
    decken  
    OP
       2014-05-08 09:29:40 +08:00
    @zxy CPU是E5335,没怎么见过市面,觉得挺牛逼了.不过相比后面两部来说已经有很大的悬殊了
    decken
        36
    decken  
    OP
       2014-05-08 09:32:02 +08:00
    @VYSE 怎么看是由哪个编译器编译的?
    Azone
        37
    Azone  
       2014-05-08 09:37:42 +08:00
    我的iMac下
    range process 0.751209974289 seconds
    xrange process 0.504092931747 seconds
    v2what
        38
    v2what  
       2014-05-08 10:14:56 +08:00
    64位kali linux,T5870笔记本Cpu,主频2GHz。

    xrange process 0.50718998909 seconds

    range process 1.72413301468 seconds
    rivershang
        39
    rivershang  
       2014-05-08 13:04:16 +08:00
    64位Ubuntu 14.04,i3 2.4GHz,4G內存:
    使用xrange連續運行3次:0.356175899506/0.361744165421/0.356063127518 seconds;
    使用range連續運行3次:0.607443809509/0.609739065170.615420103073 seconds.
    VYSE
        40
    VYSE  
       2014-05-08 13:05:37 +08:00   ❤️ 1
    @decken
    python/lib/python2.7/_sysconfigdata.py里有当时的编译参数
    Ever
        41
    Ever  
       2014-05-08 13:42:49 +08:00
    @decken 3.3G的I3是2、3代的吧, 那单颗性能差不多是E5335单颗的一倍多, 尤其你这个例子跑在单核上性能差距更大.
    decken
        42
    decken  
    OP
       2014-05-08 19:43:21 +08:00
    @Ever 确实是2代的I3
    darklowly
        43
    darklowly  
       2014-05-09 05:28:49 +08:00
    这水平,只能写一辈子python了。
    jeeyong
        44
    jeeyong  
       2016-12-04 23:44:14 +08:00
    我觉得是主频的问题吧?
    另外,如果空循环,其实只是建立了一个很大的列表吧。。
    在内存都足够大的情况下,谁建立的更快
    就是主频的问题了吧,与核心数没关系。
    然后再分析结果的话。
    第一台机器,主频快,但是比第二台的结果快的并不明显,我觉得主要问题在于他的内存时 64gb , 在创建列表的时候,内训寻址时间上消耗了一部分。
    第三台机器的主频最高,架构差异并没有那么大
    而这段代码影响性能的就是 cpu 的主频。
    所以第三台机器理所应当的最快
    其次第一,然后第二台
    一个猜想,如果把第一台机器的内存缩小到 4gb 的话。可能会再快一点。执行结果
    以上为第一种猜想
    第二种有点扯,但不排除
    楼主用的是 time.time().....严格来说这个不准确。
    如果某台机器有更多的后台应用占用 cpu 。。。这个结果就没有太大的参考价值了
    改用 time.clock()

    我常用的测试性能的方法。
    s = time.clock()
    i = 100000000
    while i > 0:
    i -= 1
    print s - time.clock()
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2705 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 104ms · UTC 09:06 · PVG 17:06 · LAX 01:06 · JFK 04:06
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.