我目前正在优化我的软件的翻译部分,这可以翻译坐标x
次。我当前的翻译代码位于translate
函数中,并且translate_map
函数中的所谓优化部分。
我读here我应该尽可能使用map
函数而不是for
循环,因为循环是在C中执行的。
当我在下面运行测试用例时,map
函数实际上比标准for
循环运行得慢。为什么map
的执行速度比传统的for
循环慢?如何优化translate函数以更快地运行?
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
答案 0 :(得分:3)
我怀疑您在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级别)。