Python:For 循环与循环 map

标签 python optimization

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

相关文章:

c - 优化计算最大素数除法的算法

c++ - 将 double 写入 EEPROM

python - Gensim 字典实现

c# - 我应该在运行 Regex.Replace 之前使用 Regex.IsMatch

javascript - 如何进一步优化 javascript 表行的创建/插入?

Python selenium 进入#document

C++,非常意外-1#INF

python - 打印没有 unicode 的 python 字典

python - 如何将复数放入 numpy 的数组中?

Python - Matplotlib - 设置 X 轴范围 - 绘制每秒数据包