为什么我的Python版本比我的Perl版本慢?

11 浏览
0 Comments

为什么我的Python版本比我的Perl版本慢?

我是一个使用Perl的人,已经有超过10年的经验,但是一个朋友说服我尝试Python,并告诉我它比Perl快很多。所以,为了好玩,我将我用Perl写的一个应用程序移植到Python上,发现它运行速度大约慢了3倍。起初,我的朋友告诉我可能是我做错了,所以我一直重写和重构,直到无法再重写和重构为止……但速度还是很慢。所以我做了一个简单的测试:

i = 0
j = 0
while (i < 100000000):
    i = i + 1
    j = j + 1
print j

$ time python python.py
  100000000
real   0m48.100s
  user    0m45.633s
  sys 0m0.043s

my $i = 0;
my $j = 0;
while ($i < 100000000) {
    ++$i; # 也测试过 $i = $i + 1,结果相同
    ++$j;
}
print $j;

$ time perl perl.pl
  100000000
real   0m24.757s
  user    0m22.341s
  sys 0m0.029s

速度差不多慢了两倍,这似乎与我看到的任何基准测试不符……是我的安装有问题,还是Python真的比Perl慢那么多?

0
0 Comments

Python版本较Perl版本慢的原因可能是代码结构不正确,导致语法不符合Python语言特点。通过重新调整代码结构,可以提高运行速度。在Python中,应该尽量使用for循环而不是while循环,使用range()函数可以提高速度。

另外,Python 2和Python 3的速度也有所不同。在某些情况下,使用xrange()函数代替range()函数可以提高速度。

在我的机器上,使用正确的语法后,运行速度至少提高了两倍。使用xrange()函数比range()函数快了10倍以上。

因此,如果在Python 2环境下,应该使用xrange()函数。在我的笔记本电脑上,使用range()函数运行时间为27.7秒,而使用xrange()函数只需21.4秒。

另外,将range()替换为xrange()可以进一步提高速度,而将j = j + 1替换为j+=1也可以稍微提升性能。

对于一个“编程”语言来说,使用“正确”的语法是一种正常的行为吗?你是说在编程语言中,即使使用错误的语法也能得到有效或最优的结果吗?听起来像是魔法。在我所了解的任何语言中,当情况需要使用for循环时,使用while循环被认为是错误的,或者至少是笨拙的。

通常,工具用户使用螺丝刀拧螺丝,使用锤子钉钉子是一种正常的行为。

0
0 Comments

为什么我的Python版本比Perl版本慢?

在这个问题中,出现了Python版本比Perl版本慢的原因以及解决方法。

原因:

1. 使用不同的循环方式。通过在Python和Perl中使用for循环,可以提高程序的运行速度。如果在Perl中使用for循环,原始的Perl示例将快两倍。

2. 优化代码。通过对代码进行优化,可以进一步提高速度。例如,在Perl中使用++$j for 1..100000000;可以进一步提高速度。

3. 使用更快的方法。有时候可以使用更快的方法来实现相同的功能。例如,通过使用print {STDOUT} (1..10000000)[-1];可以将运行时间缩短到1秒。

解决方法:

1. 使用for循环。在Python中,可以使用for循环来替换原有的循环方式,以提高速度。

2. 优化代码。对代码进行优化,减少不必要的操作,可以进一步提高速度。

3. 尝试其他方法。如果以上方法无效,可以尝试使用其他更快的方法来实现相同的功能。

通过使用更快的循环方式、优化代码和尝试其他方法,可以提高Python版本的速度,使其与Perl版本相媲美。然而,在进行微基准测试时,需要注意程序的实际运行情况,以获得准确的比较结果。

0
0 Comments

为什么我的Python版本比我的Perl版本慢?

这个问题的原因是,Python的本地变量比全局变量要快得多。通过将代码放入函数中,可以大大提高性能。此外,使用更高级的、更简短的代码也往往更快。

然而,这个微基准测试并不具有实际意义。真正的语言速度问题是:一个平均真实应用程序的性能如何?要了解这一点,应该考虑以下因素:

- 复杂代码中典型的操作组合。您的代码中没有包含任何数据结构、函数调用或面向对象操作。

- 足够大的代码库以感受到缓存效应。许多解释器优化会以速度换取内存,这在任何微小的基准测试中都无法公正地衡量。

- 优化机会:在编写代码之后,如果速度不够快,您可以轻松地使其更快吗?例如,将繁重的工作转移到高效的C库有多困难?

PyPy的基准测试和Octane是真实语言速度基准测试的很好例子。

如果你想进行数值计算,Python在科学家中非常受欢迎。他们喜欢它的简洁伪数学语法和简短的学习曲线,还喜欢它优秀的numpy库用于数组计算以及包装其他现有C代码的便利性。

此外,还有Psyco JIT,它可能会在1秒钟内运行您的示例,但是我现在无法检查,因为它只能在32位x86上运行。

为了解决这个问题,可以尝试使用PyPy进行测试,它是一个跨平台的、不断改进的JIT编译器。

总结起来,微基准测试并不能真正反映出语言的性能,应该使用更真实的基准测试来评估语言的性能。

0