如何解决使用字典 get() 作为函数从地图创建 Python 列表与使用 for 循环创建字典 get() 列表
让我感到非常惊讶的是,看似更简单、负担更轻的功能却效率更低。
我对两种方法进行了测试,将 10000 个 aj(随机化)字符长字符串作为 word
。 旧函数是 a
,新函数是 { {1}}:
b
def a(word):
dictionary = {"a": 1,"b": 2,"c": 3,"d": 4,"e": 5,"f": 6,"g": 7,"h": 8,"i": 9,"j": 10,}
word = list(map(dictionary.get,list(word)))
return word
def b(word):
dictionary = {"a": 1,}
word = [dictionary.get(l,l) for l in word]
return word
与 for 循环相比应该具有微小的速度优势:https://stackoverflow.com/a/1247490/12494235。但是,就我而言,优势是显着的。函数 map
中正在执行更多操作,并且它始终需要多花 0.001-0.003 秒。此外,将 map iterable 转换为列表应该会减慢 b
。
A - 使用字典 get() 作为函数从地图创建列表
a
B - 创建一个带有 for 循环的字典 get() 列表
160 function calls (159 primitive calls) in 0.002 seconds
Ordered by: call count
ncalls tottime percall cumtime percall filename:lineno(function)
12 0.000 0.000 0.000 0.000 {method 'rstrip' of 'str' objects}
7 0.000 0.000 0.000 0.000 {method 'join' of 'str' objects}
6 0.000 0.000 0.000 0.000 <frozen importlib._bootstrap>:222(_verbose_message)
6 0.000 0.000 0.000 0.000 {built-in method builtins.getattr}
...
这怎么可能?我在分析两者时做错了什么吗?为什么 for 循环如此低效?
解决方法
例如,如果您有 arr1
和 arr2
,两者的长度都是 n
= 10^9。
def A:
for i in range(n):
arr1[i] = 1
arr2[i] = 2
def B:
for i in range(n):
arr1[i] = 1
for i in range(n):
arr2[i] = 2
您应该认为 A
应该比 B
快,但事实并非如此...因为在 A
的情况下,编译器需要从 {{1 }} 到 arr1 ptr
在每个 arr2 ptr
中。甚至 iter
也有 2 个 for,但该操作首先只为 arr1 调用,然后只为 arr2 调用 - 它非常有效。
所以一切都取决于方法是如何实现的,编译器是如何工作的,或者正在处理什么对象,以及它如何保存在内存中。
希望你能理解为什么 B
应该如此低效...
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。