Python的速度有多快?

时间:2009-11-06 08:27:43

标签: python performance

我是一名Java程序员,如果有一件事我不喜欢它,那就是速度。 Java看起来真的很慢,但到目前为止我编写的很多Python 脚本程序似乎都很快。

所以我只是想知道Python是否比Java或C#更快,以及它与C / C ++相比如何(我认为它会慢于)?

8 个答案:

答案 0 :(得分:29)

就原始性能而言,Python肯定比Java,C#和C / C ++慢。但是,对于用户/观察者来说还有其他一些重要的事情,例如总内存使用量,初始启动时间等。对于大多数情况,Python 足够快;)

This site可让您将不同的编程语言相互比较。它使用简单的条形图来显示速度,内存使用情况等。

如果您有兴趣,可以看一下备受期待的Unladen Swallow项目,该项目正在努力将Python的性能提高到CPython的五倍(!)

答案 1 :(得分:22)

这完全取决于用例。对于长时间运行的应用程序(如服务器),Java已被证明非常快 - 甚至比C更快。这是可能的,因为JVM可能会将热字节码编译为机器代码。在执行此操作时,可能会充分利用CPU的每个功能。这通常不可能用于C,至少在您离开实验室环境时:只需假设向您的客户分发十几个优化版本 - 这根本不起作用。

但回到你的问题:这真的取决于。例如。如果启动时间是一个问题(例如,对于服务器应用程序不是问题),Java可能不是最佳选择。它也可能取决于您的热门代码区域:如果它们位于具有一些Python代码的本机库中,只需将它们粘合在一起,您就可以使用Python获得类似C的性能。

通常情况下,脚本语言往往会更慢 - 至少在大多数情况下都是如此。

答案 2 :(得分:4)

这是另一个似乎更完整的stackoverflow question:您还可以查看computer language shootout

答案 3 :(得分:4)

如果你想要Python的速度,特别是对于复杂的算法,Psyco通常有帮助。从他们的网页:

  

将Psyco视为一种   实时(JIT)编译器,一点点   有点像其他的存在   发出机器代码的语言   苍蝇而不是解释你的   Python程序一步一步。该   与传统的差异   JIT编译器的方法就是这样   Psyco写了几个版本的   相同的块(块是一个块   功能),由...优化   专门针对某些类型的   变量(“种类”可以表示类型,   但它更通用)。结果是   你未经修改的Python程序   跑得更快。

     

2x到100x加速,通常为4x,   使用未经修改的Python解释器   和未修改的源代码,只是一个   动态可加载的C扩展   模块。

奇怪的是,上面的链接中没有提到它。

答案 4 :(得分:2)

很难对两种语言的运行速度进行真正客观和一般的比较。在比较任何两种语言X和Y时,人们经常发现X在某些方面比Y快,而在其他方面则慢。对我来说,这使得在线提供的任何基准测试/比较都无济于事。最好的方法是自己测试,看看每种语言对你正在做的工作有多快。

话虽如此,在测试Java和Python等语言时应该记住一些事情。通过使用更适合语言的结构(例如Python中的列表推导,或者使用char []和StringBuilder来处理Java中的某些String操作),通常可以显着加速这些语言中的代码。而且,对于Python来说,使用psyco可以大大提高程序的速度。然后就是使用适当的数据结构并密切关注代码的运行时复杂性的整个问题。

答案 5 :(得分:1)

我认为Keyle的回答(除其他外)给回家带来了一个基本点:巨大的数量取决于你做事的方式。这个链接为C ++提供了两个答案,但我很难相信任何人通常会编写与其中任何一个非常相似的C ++。我的第一次尝试看起来像这样:

#include <iostream>
#include <vector>
#include <time.h>

class person { 
    int count_;
    static int current_;
public:
    person() : count_(++current_) {}
    int count() { return count_; }
};
int person::current_ = 0;
typedef std::vector<person> plist;
class chain {
    plist people_;
    void check_wrap(std::vector<person>::iterator &p) {
        if (p==people_.end())
            p = people_.begin();
    }
    void advance(std::vector<person>::iterator &p, int places) {
        for (int i=0; i<places; i++)
            check_wrap(++p);
    }
public:
    chain(int length) : people_(length) {}
    person *kill(int n) { 
        plist::iterator current = people_.begin();
        while (people_.size()>1) {
            advance(current, n);
            current = people_.erase(current);
            check_wrap(current);
        }
        return &(*current);
    }
};
int main() {
    const int ITER = 1000000;  
    clock_t start = clock();
    for(int i = 0 ; i <ITER; i++) {
        chain c(40);
        c.kill(3);  
    }
    clock_t end = clock();
    std::cout << "Time per iterator: " << (((end - start) /(double)CLOCKS_PER_SEC/ITER)*1000000 << " microseconds.\n";
    return 0;
}

(为了便携性,我使用了clock()而不是gettimeofday,但任何想要的人都可以轻易地改变它。)

关于这一点有几点让我觉得有趣。首先,代码已经缩短了 lot - 实际上,竞争对手显示的是最短的代码。其次,代码变得更快 - 可能比C ++中特别优化的版本更快。

最后,至少对我而言,似乎代码已经变得更容易阅读和理解。对我来说,他的'shout()'似乎很混乱,就像让'Person'真的成为Person对象链接列表中的节点一样,Chain处理一些链表管理,但是'Person'也做了链接 - 列出东西和'人'的东西。

这并不一定(或直接)告诉我们Python的速度,但我认为它可以让您了解可以在网上找到的许多基准测试的质量。编写几乎任何有意义且准确的基准非常困难 - 并且尝试比较各种语言是其中最困难的基准之一。

答案 6 :(得分:0)

这是一个你无法正确回答的问题,因为这一切都取决于它必须快速。 Java适用于大型服务器,当您需要重新编译和测试很多次代码时(编译太慢),这很糟糕。 Python甚至不需要编译来测试!

在生产环境中,说Java比C更快是完全愚蠢的...就像说C比汇编更快。

无论如何,它无法准确回答:这一切都取决于你想要/需要的东西。

答案 7 :(得分:0)

对于Python,速度也取决于解释器实现......我看到pypy通常比cpython快。