python - 元组与生成器表达式。为什么性能翻转,序列越长?
问题描述
我正在查看以下代码,并认为我注意到了潜在的性能问题。
def multiply(x):
return x * 10
def test():
data = tuple(x for x in range(5))
first_map = tuple(map(
multiply,
tuple(x for x in data)
))
second_map = tuple(map(
multiply,
tuple(x for x in data)
))
ziped = tuple(zip(data, second_map, first_map))
return ziped
import timeit
print(timeit.timeit('test()', globals=globals()))
为我运行此打印5.317162958992412
。
我认为所有这些中间体tuple
都会导致对数据的多次迭代,所以我把它变成了以下内容。
def multiply(x):
return x * 10
def test():
data = tuple(x for x in range(5))
first_map = map(
multiply,
(x for x in data)
)
second_map = map(
multiply,
(x for x in data)
)
ziped = tuple(zip(data, second_map, first_map))
return ziped
import timeit
print(timeit.timeit('test()', globals=globals()))
事实上,4.783027238998329
为我运行这个打印,所以我们优化了性能。耶!
但现在是令人惊讶的(对我来说)部分!. 当我们放大数据时,结果会翻转!
换句话说,如果我们更改data
为data = tuple(x for x in range(50))
,那么具有中间元组的版本会变得更快。
我错过了什么?
解决方案
推荐阅读
- reactjs - FB API 获取值之外的变量返回未定义
- ajax - 如何使用 ajax 事件和渲染消息通过 @FacesValidator 执行单个输入验证?
- c++ - C++ 操作优先表中的后增量与赋值
- c++ - 如何使用命令行在窗口 10 中设置 Qt5 静态
- javascript - 如何在 PHP 中更改密码?
- amazon-web-services - 带有 Nginx 的 AWS 私有 API 网关
- perl - Perl:无法为 HTTPS 网站使用 LWP::Parallel::UserAgent
- python - python - 当两个字符串都存储在python的列表中时,如何检查一个字符串是否包含子字符串?
- javascript - 将 setTimeout 与 Web Worker 一起使用时 React Hooks 延迟
- python - 使用对象的 id() 作为哈希值