gpt4 book ai didi

python - 为什么 Python 对于一个简单的 for 循环来说这么慢?

转载 作者:IT老高 更新时间:2023-10-28 21:39:56 31 4
gpt4 key购买 nike

我们正在 Python 中进行一些 kNNSVD 实现。其他人选择了 Java。我们的执行时间非常不同。我使用 cProfile 查看我在哪里出错,但一切都很好 fine实际上。是的,我也使用 numpy。但我想问一个简单的问题。

total = 0.0
for i in range(9999): # xrange is slower according
for j in range(1, 9999): #to my test but more memory-friendly.
total += (i / j)
print total

这段代码在我的电脑上需要 31.40 秒。

此代码的 Java 版本在同一台计算机上花费 1 秒或更短的时间。我想,类型检查是这段代码的主要问题。但是我应该为我的项目做很多这样的操作,我认为 9999*9999 并不是那么大的数字。

我认为我犯了错误,因为我知道 Python 被许多科学项目使用。但是为什么这段代码这么慢,我该如何处理比这更大的问题呢?

我应该使用诸如 Psyco 之类的 JIT 编译器吗?

编辑

我还说这个循环问题只是一个例子。代码不像这样简单,您的改进/代码示例可能很难付诸实践。

另一个问题是,如果我使用正确,我可以使用 numpyscipy 实现大量数据挖掘和机器学习算法吗?

最佳答案

为什么在这个示例循环中 Java 比 Python 快?

新手说明:想象一个程序,例如 cargo 列车,它在前进时铺设自己的火车轨道。在火车可以移动之前必须铺设轨道。 Java Freight列车可以在列车前方发送数千个轨道层,全部并行工作,提前数英里铺设轨道,而 python 一次只能 dispatch 一名劳工,并且只能在前方10英尺处铺设轨道。火车是。

Java 具有强大的类型,使编译器能够使用 JIT 功能:( https://en.wikipedia.org/wiki/Just-in-time_compilation ) 使 CPU 能够在将来需要指令之前并行获取内存并执行指令。 Java 可以“某种程度上”在你的 for 循环中与自身并行运行指令。 Python 没有具体的类型,因此必须在每条指令中确定要完成的工作的性质。这会导致您的整个计算机停止并等待重新扫描所有变量中的所有内存。 python中的含义循环是多项式O(n^2)时间,而Java循环可以,而且通常是线性时间O(n),由于强类型。

I think I am making mistakes because I know Python is used by lots of scientific projects.

他们大量使用 SciPy(NumPy 是最突出的组件,但我听说围绕 NumPy API 开发的生态系统更为重要)这极大地加速了这些项目的各种操作需要。你做错了什么:你没有用 C 编写你的 critical 代码。Python 非常适合一般开发,但放置良好的扩展模块本身就是一项重要的优化(至少当你处理数字时)。 Python 是一种非常糟糕的语言,无法在其中实现紧密的内部循环。

默认(目前也是最流行和广泛支持的)实现是一个简单的字节码解释器。即使是最简单的操作,如整数除法,也可能需要数百个 CPU 周期、多次内存访问(类型检查是一个流行的例子)、几个 C 函数调用等,而不是几个(甚至单个,在整数的情况下)除法)指令。此外,该语言设计有许多增加开销的抽象。如果您使用 xrange,您的循环会在堆上分配 9999 个对象 - 如果您使用 range 则更多(99999999 整数减去大约 256256 用于缓存的小整数)。此外,xrange 版本在每次迭代时调用一个方法来推进 - 如果序列上的迭代没有特别优化,range 版本也会调用。尽管如此,它仍然需要一个完整的字节码调度,这本身就非常复杂(当然,与整数除法相比)。

看看什么是 JIT 会很有趣(我会推荐 PyPy 而不是 Psyco,后者不再积极开发,而且范围非常有限 - 虽然它可能适用于这个简单的示例)。在一小部分迭代之后,它应该产生一个近乎最优的机器代码循环,并增加了一些保护 - 简单的整数比较,如果它们失败则跳转 - 以保持正确性,以防你在该列表中得到一个字符串。 Java 可以做同样的事情,只是更快(它不必先跟踪)和更少的守卫(至少如果你使用 ints)。这就是为什么它要快得多。

关于python - 为什么 Python 对于一个简单的 for 循环来说这么慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8097408/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com