我目前正在优化软件的翻译部分,该部分会翻译坐标 x
次。我当前的翻译代码位于 translate
函数中,而所谓的优化部分位于 translate_map
函数中。
我读到here尽可能使用 map
函数而不是 for
循环,因为循环是在 C 中执行的。
当我运行下面的测试用例时,map
函数实际上比标准 for
循环运行得慢。为什么 map
的执行速度比传统的 for
循环慢?如何优化翻译功能以使其运行得更快?
import time
def translate(atom_list):
for i in atom_list:
i[1]+=1
i[2]+=1
i[3]+=1
atoms = [[1,1,1,1]]*1000
start = time.time()
for x in xrange(10000):
translate(atoms)
print time.time() - start
atoms = [[1,1,1,1]]*1000
start = time.time()
def translate_map(atom_list):
atom_list[1]+=1
atom_list[2]+=1
atom_list[3]+=1
for x in xrange(10000):
map(translate_map,atoms)
print time.time() - start
输出:
2.92705798149
4.14674210548
最佳答案
我怀疑您在 map
实现中看到的大部分开销来自函数调用开销。 translate
函数在一个循环内完成所有工作,因此整个过程只需一个函数调用。 map
的实现对列表中的每个项目进行单独的函数调用。
开销的第二个来源(尽管我怀疑它与函数调用相比很小)是 map
创建一个包含函数返回值的列表。由于 translate_map
没有 return
语句,因此这将是所有 None
值。请注意,在 Python 3 中,map
是一个生成器,因此您的 map
版本根本无法工作,除非您迭代 map
的结果> 打电话。不过,显式循环更加清晰,所以我会坚持这样做(如果您不选择 numpy)。
哦,是的,numpy
会让这变得更容易(而且几乎肯定也更快):
def translate(arr): # arr should be a numpy array
arr += 1
就是这样!不需要循环(在 Python 级别)。
关于Python:For 循环与循环 map ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16233678/