微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用字典 get() 作为函数从地图创建 Python 列表与使用 for 循环创建字典 get() 列表

如何解决使用字典 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 循环如此低效?

解决方法

例如,如果您有 arr1arr2,两者的长度都是 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 举报,一经查实,本站将立刻删除。