python - Python 中 "sum"的理解速度

标签 python optimization

我的印象是使用求和构造比运行 for 循环快得多。然而,在下面的代码中,for 循环实际上运行得更快:

import time

Score = [[3,4,5,6,7,8] for i in range(40)]

a=[0,1,2,3,4,5,4,5,2,1,3,0,5,1,0,3,4,2,2,4,4,5,1,2,5,4,3,2,0,1,1,0,2,0,0,0,1,3,2,1]

def ver1():
    for i in range(100000):
        total = 0
        for j in range(40):
            total+=Score[j][a[j]]
    print (total)

def ver2():
    for i in range(100000):
        total = sum(Score[j][a[j]] for j in range(40))
    print (total)


t0 = time.time()
ver1()
t1 = time.time()
ver2()
t2 = time.time()

print("Version 1 time: ", t1-t0)
print("Version 2 time: ", t2-t1)

输出是:

208
208
Version 1 time:  0.9300529956817627
Version 2 time:  1.066061019897461

我做错了什么吗?有没有办法更快地做到这一点?

(注意这只是我设置的一个demo,在我实际应用中不会重复这样的分数)

一些附加信息:它在 Python 3.4.4 64 位、Windows 7 64 位、i7 上运行。

最佳答案

这个好像和系统有关,可能是python版本。在我的系统上,差异约为 13%:

python sum.py 
208
208
('Version 1 time: ', 0.6371259689331055)
('Version 2 time: ', 0.7342419624328613)

这两个版本不测量 sum 与手动循环相比,因为循环“主体”不相同。 ver2 做了更多的工作,因为它创建了 100000 次生成器表达式,而 ver1 的循环体几乎是微不足道的,但它为每次迭代创建了一个包含 40 个元素的列表。您可以将示例更改为相同,然后您会看到 sum 的效果:

def ver1():
    r = [Score[j][a[j]] for j in range(40)]
    for i in xrange(100000):
        total = 0
        for j in r:
            total+=j
    print (total)

def ver2():
    r = [Score[j][a[j]] for j in xrange(40)]
    for i in xrange(100000):
        total = sum(r)
    print (total)

我已将所有内容移出内部循环体和 sum 调用,以确保我们只测量手工制作的循环的开销。使用 xrange 而不是 range 进一步改善了整体运行时间,但这适用于两个版本,因此不会改变比较。在我的系统上修改代码的结果是:

python sum.py
208
208
('Version 1 time: ', 0.2034609317779541)
('Version 2 time: ', 0.04234910011291504)

ver2ver1 快五倍。这是使用 sum 而不是手工制作的循环的纯粹性能提升。

灵感来自 ShadowRanger's comment on the question about lookups ,我修改了示例以比较原始代码并检查绑定(bind)符号的查找是否:

def gen(s,b):
    for j in xrange(40):
        yield s[j][b[j]]

def ver2():
    for i in range(100000):
        total = sum(gen(Score, a))
    print (total)

我创建了一个小型自定义生成器,它在本地绑定(bind) Scorea 以防止在父范围中进行昂贵的查找。执行这个:

python sum.py
208
208
('Version 1 time: ', 0.6167840957641602)
('Version 2 time: ', 0.6198039054870605)

仅符号查找就占了大约 12% 的运行时间。

关于python - Python 中 "sum"的理解速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35191815/

相关文章:

python - 是否有任何选项可以包含托管在在线虚拟主机上的 Python 脚本?

python - 如何使这个循环更快?

c++ - 从位数组中提取任何更聪明的方法?

python - 如何计算一个数据帧中的字符值并将其添加到另一个现有数据帧?

Python:使用 osmapi 执行查询时列出索引超出范围

python - 父线程在子线程之前退出 [python]

c++ - 快速复制 `std::vector<std::uint8_t>`

java - 如果信息在转换为字节码的过程中丢失,是否有可能编写一个像样的 Java 优化器?

android - 一般渲染和性能问题 (OpenGL)

python - 如何在全息 View 中使用 matplotlib 后端