1

我目前正在优化我的软件的翻译部分,它翻译坐标x的次数。我当前的翻译代码在translate函数中,并且在函数中被认为是优化的部分translate_map

我在这里读到,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
4

1 回答 1

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

于 2013-04-26T10:43:10.903 回答