在 itertools 模块的文档中我发现了这个评论
def dotproduct(vec1, vec2):
return sum(imap(operator.mul, vec1, vec2))
请注意,上述许多配方可以通过替换全局来优化
使用定义为默认值的局部变量进行查找。例如,
点积配方可以写成:
def dotproduct(vec1, vec2, sum=sum, imap=imap, mul=operator.mul):
return sum(imap(mul, vec1, vec2))
如何?。
是否有实际的显着加速(可以平衡较大函数签名的不便)?
在哪种特定条件下,在所示的情况下使用局部变量是相关的?
Edit:我用 timeit 进行了测试,有任何相关的差异。
对于两个 40 项列表作为 vec1、vec2:
全局查找 -> 3.22720959404
本地查找 -> 3.19884065683
也就是说,只有大约。 1% 的增益。
是否有实际的显着加速(可以平衡较大函数签名的不便)?
我非常怀疑这一点,因为在原始定义中每个查找都发生一次。请注意,您已经更改了该函数的含义。
在所示的情况下,在哪些特定条件下使用局部变量是相关的?
仅在紧密循环内;在这种情况下,如果dot_product
例如,用于非常大的矩阵乘法(无论如何你都不会在纯Python中执行此操作,更不用说使用迭代器了)。
EDIT:我刚刚反汇编了这两个函数,我的预感是错误的,尽管我的观点仍然成立:
>>> def dotproduct(vec1, vec2):
... return sum(imap(operator.mul, vec1, vec2))
...
>>> dis.dis(dotproduct)
2 0 LOAD_GLOBAL 0 (sum)
3 LOAD_GLOBAL 1 (imap)
6 LOAD_GLOBAL 2 (operator)
9 LOAD_ATTR 3 (mul)
12 LOAD_FAST 0 (vec1)
15 LOAD_FAST 1 (vec2)
18 CALL_FUNCTION 3
21 CALL_FUNCTION 1
24 RETURN_VALUE
>>> def dotproduct(vec1, vec2, sum=sum, imap=imap, mul=operator.mul):
... return sum(imap(mul, vec1, vec2))
...
>>> dis.dis(dotproduct)
2 0 LOAD_FAST 2 (sum)
3 LOAD_FAST 3 (imap)
6 LOAD_FAST 4 (mul)
9 LOAD_FAST 0 (vec1)
12 LOAD_FAST 1 (vec2)
15 CALL_FUNCTION 3
18 CALL_FUNCTION 1
21 RETURN_VALUE
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)