【问题标题】:Why is all() slower than many "and" commands? Python为什么 all() 比许多“and”命令慢? Python
【发布时间】:2014-03-19 20:12:02
【问题描述】:

有人可以解释为什么第一个代码比第二个运行得快的原因吗?

# First example
if a%1 == 0 and a%2 == 0 and a%3 == 0 and a%4 == 0 and a%5 == 0:
    # do something if True

# Second example
list1 = list(range(1,6,1))
if all(a%i == 0 for i in list1)
    # do something if True

*如果为false则a变量发生变化

我知道可以排除 1 和 4,但它是针对学校论文的,我将在其中使用它来展示一个不好的例子。不过,我还是想知道原因。 谢谢

【问题讨论】:

  • 你如何比较执行时间?
  • 使用了时间模块。原码数到20,然后差别就很明显了。

标签: python tags command


【解决方案1】:

在第二个示例中,您动态创建了一个列表,因此需要额外的时间,因为无论如何您都会执行所有比较,但会增加内存预留开销(您正在处理内存,这比处理慢一些数量级与处理器寄存器)。

【讨论】:

  • 很抱歉没有得到任何信息。有什么简单的答案吗?
  • 创建列表时,您需要为其内容保留内存(Python 会为您执行此操作)。为此,处理器将询问主内存在哪里有足够的空间来分配列表,然后它会比较你的 if 子句。与处理器速度相比,这种内存访问确实很慢。由于处理器将在高速缓存(快速存取存储器)上拥有指令(比较),因此访问它们只需很少的时间。在主内存中加载一个列表可能需要 100 倍的时间。
  • 嗯...如果差异如此之大,可能与 Python 处理“all()”调用的方式有关。我猜它正在创建一个函数,将不同的值映射到“a”中。我不知道 Python 是如何做到的,但应该是这样。无论如何,重点是第一种方式只进行比较,而在第二种方式中,您进行相同的比较以及假设时间开销的其他计算。
  • 创建和访问列表确实需要一些时间,但主要的罪魁祸首应该是 for 循环。这在 python 中本来就很慢。放置列表的创建,并更改两者以访问该列表的元素,仍然显示这个时间差。
  • @SimonÖnnered 是的,在当前的计算机体系结构中,内存根据其大小和访问速度分为几个层次。最大,访问最慢。在您的计算机中,您有一个硬盘驱动器、RAM 内存、多级缓存和处理器注册表。编译的程序指令在调用时应该在缓存中。您在运行时创建列表,因此您必须保留 RAM 内存。关于您的第二个问题,您必须采用折衷的解决方案:您可以节省一些代码编写来权衡程序的速度。由您决定。
猜你喜欢
  • 2017-01-15
  • 1970-01-01
  • 1970-01-01
  • 2015-05-28
  • 2017-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-22
相关资源
最近更新 更多