Python:对于循环Vs.地图

时间:2013-04-26 09:58:16

标签: python optimization

我目前正在优化我的软件的翻译部分,这可以翻译坐标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

1 个答案:

答案 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级别)。