在Python的性能方面,是一个列表理解,还是比for循环更快的map(),filter()和reduce()等函数?从技术上讲,为什么它们"以C速度运行",而"for循环以python虚拟机速度运行"?
假设在我正在开发的游戏中,我需要使用for循环绘制复杂且巨大的地图.这个问题肯定是相关的,因为如果列表理解确实更快,那么为了避免滞后(尽管代码的视觉复杂性),这将是一个更好的选择.
什么是使用的优势列表理解在forPython中循环?
主要是为了让它更具人性化,还是有其他理由使用列表理解而不是循环?
在尝试解决更复杂的问题时,我开始将访问速度与局部变量与成员变量进行比较.
这是一个测试程序:
#!/usr/bin/env python
MAX=40000000
class StressTestMember(object):
def __init__(self):
self.m = 0
def do_work(self):
self.m += 1
self.m *= 2
class StressTestLocal(object):
def __init__(self):
pass
def do_work(self):
m = 0
m += 1
m *= 2
# LOCAL access test
for i in range(MAX):
StressTestLocal().do_work()
# MEMBER access test
for i in range(MAX):
StressTestMember().do_work()
Run Code Online (Sandbox Code Playgroud)
我知道实例化StressTestMember和StressTestLocal每次迭代可能看起来不错,但在建模程序中这些基本上是Active Records是有意义的.
经过简单的基准测试,
本地版本的速度提高了大约33%,同时仍然是课程的一部分.为什么?
我试图找到列表理解的效率,但它看起来比正常的功能操作更昂贵.谁能解释一下?
def squares(values):
lst = []
for x in range(values):
lst.append(x*x)
return lst
def main():
t = timeit.Timer(stmt="lst = [x*x for x in range(10)]")
print t.timeit()
t = timeit.Timer(stmt="squares",setup="from __main__ import squares")
print t.timeit()
lst = [x*x for x in range(10)]
print lst
print squares(10)
----Output:---
2.4147507644
0.0284455255965
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
Run Code Online (Sandbox Code Playgroud)
对于相同的输出,与列表理解相比,正常函数在非常短的时间内计算.
我认为列表理解更有效.