我想我犯错了,因为我知道Python已被许多科学项目使用。
他们大量使用SciPy(NumPy是最重要的组件,但我听说围绕NumPyAPI开发的生态系统更为重要),这些速度 大大_加快了这些项目所需的各种操作。这是您做错的事情:您不是用C编写 _关键
代码。Python对于一般而言的开发非常有用,但是放置适当的扩展模块本身就是至关重要的优化(至少在处理数字时)。
。Python是一种非常糟糕的语言,用于实现紧密的内部循环。
默认的(目前是最受欢迎和广泛支持的)实现是一个简单的字节码解释器。即使是最简单的操作(例如整数除法)也可能需要数百个CPU周期,多个内存访问(常见的类型检查),多个C函数调用等,而不是几个(对于整数,甚至是单个)除法)指令。此外,该语言具有许多抽象设计,这增加了开销。如果使用xrange,循环会在堆上分配9999个对象;如果使用xrange,则会在堆上分配更多的对象
range(9999* 9999整数减去256 *256左右的高速缓存小整数)。此外,该
xrange版本还会在每次迭代时调用一个方法来进行扩展-
range如果未专门优化序列的迭代,则版本也是如此。但是,它仍然需要整个字节码分配,这本身是非常复杂的(当然,与整数除法相比)。
看到什么是JIT会很有趣(我建议使用PyPy而不是Psyco,后者不再积极开发,而且范围也非常有限-
尽管对于这个简单的示例来说,它可能很好用)。经过一小部分的迭代后,它应该会产生一个几乎最佳的机器代码循环,并增加一些保护措施-
简单的整数比较,如果失败,则跳转-
以保持正确性,以防您在该列表中出现字符串。Java可以做同样的事情,只是更快(不必先跟踪),并且只需较少的防护(至少如果使用
ints)。这就是为什么它要快得多的原因。



