【问题标题】:Python 2.7.8 (64bit) on Windows (64bit) is half as fast as 2.7.8 (64bit) on Ubuntu (64bit)Windows(64 位)上的 Python 2.7.8(64 位)的速度是 Ubuntu(64 位)上的 2.7.8(64 位)的一半
【发布时间】:2015-05-01 14:18:55
【问题描述】:

在 Linux 上需要 1.09171080828 秒。

在 Windows 上需要 2.14042000294 秒。

基准代码:

import time


def mk_array(num):
        return  [x for x in xrange(1,num)]

def run():
        arr = mk_array(10000000)
        x = 0
        start = time.time()
        x = reduce(lambda x,y: x + y, arr)
        done = time.time()
        elapsed = done - start
        return elapsed

if __name__ == '__main__':
        times = [run() for x in xrange(0,100)]
        avg = sum(times)/len(times)
        print (avg)

我知道 GIL 会创建或多或少的单线程脚本。

Windows 机器是我的 Hyper-V 主机,但应该足够强大,可以全速运行单线程脚本。 12 核 2.93Ghz Intel X5670s、72GB 内存等

Ubuntu VM 有 4 核和 8GB 内存。

两者都运行 Python 2.7.8 64 位。

为什么 windows 的速度是原来的一半?

编辑:我在 0.010593495369 秒内丢掉了两个零,linux 完成了,在 0.171899962425 秒内完成了 windows。谢谢大家,满足好奇心。

【问题讨论】:

    标签: python windows benchmarking


    【解决方案1】:

    这是因为 Windows 中 long 的大小,在 Windows 中,long32 位在 unix 中是 64 位,所以你会更快地遇到 Arbitrary-precision_arithmetic 问题,这是分配成本更高的问题.

    相关问题Why are python's for loops so non-linear for large inputs

    如果您单独对 xrange 进行基准测试,您会看到相当大的差异。

    Windows 使用 LLP64 背后的原因似乎是与 32 位代码兼容:

    另一种替代方案是 LLP64 模型,它通过将 int 和 long 保留为 32 位来保持与 32 位代码的兼容性。 “LL”指的是“long long integer”类型,在所有平台上至少为64位,包括32位环境。

    取自wiki/64-bit_computing

    【讨论】:

    • 那么问题是Python的64位Windows版本使用long而不是longlong?知道为什么吗?
    • @HarryJohnston,请参阅Include/intobject.h 了解PyIntObject 的定义。当值超过 C long 的最大值时,解释器切换到使用任意精度 PyLongObject。 Python 3 取消了PyIntObject,只使用了任意精度的整数。
    • 我理解为什么 Visual C++ 将 32 位和 64 位代码的 long 定义为 32 位。我不明白为什么 64 位版本的 Python 在 Windows 平台上使用 long 而不是 longlong,而且这些链接中的任何一个似乎都没有解决这个问题。不过,这没什么大不了的,我只是好奇。它可能就像“因为所有代码已经使用了很长时间,我们不想全部更改”一样简单。 :-)(我原以为#define long longlong 会一击解决它,但我想这可能会产生不受欢迎的副作用。)
    • @HarryJohnston,这需要重写大量代码才能使用有条件定义的PY_LONG 宏。我认为没有人会为如此重大的重写而烦恼,因为核心开发人员不喜欢在 Python 2 上工作。大部分精力都用于 Python 3 开发,它不再使用 PyIntObject
    • @eryksun:这听起来很合理。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-09
    相关资源
    最近更新 更多