Насколько быстро Python?

Я программист на Java, и если есть что-то, что мне не нравится в этом, это будет скорость. Java кажется очень медленным, но многие программы Python scripts, которые я написал до сих пор, кажутся очень быстрыми.

Итак, мне просто интересно, работает ли Python быстрее, чем Java или С#, и как это сравнивается с C/С++ (что, по моему мнению, будет медленнее, чем)?

Ответ 1

С точки зрения производительности raw, Python определенно медленнее, чем Java, С# и C/С++. Однако для пользователя/наблюдателя есть другие вещи, такие как использование общей памяти, начальное время запуска и т.д. Для большинства вещей Python достаточно быстр;)

Этот сайт позволяет сравнивать разные языки программирования друг с другом. Он использует простые гистограммы для отображения скорости, использования памяти и т.д.

Если вам интересно, вы можете взглянуть на ожидаемый проект Unladen Swallow, который стремится повысить производительность Python до в пять раз больше, чем у CPython (!)

Ответ 2

Это полностью зависит от usecase. Для приложений с длительным сроком службы (например, серверов) Java оказалась чрезвычайно быстрой - даже быстрее, чем C. Это возможно, поскольку JVM может скомпилировать горячий байт-код для машинного кода. При этом он может полностью использовать преимущества каждой функции CPU. Это, как правило, невозможно для C, по крайней мере, как только вы покидаете лабораторную среду: просто предположите, что распределите десятки оптимизированных сборок своим клиентам - это просто не сработает.

Но вернемся к вашему вопросу: это действительно зависит. Например. если время запуска является проблемой (что не является проблемой для серверного приложения, например), Java может быть не лучшим выбором. Это может также зависеть от того, где находятся ваши горячие области кода: если они находятся внутри собственных библиотек с некоторым кодом Python, чтобы просто склеить их вместе, вы также сможете получить C как производительность с Python.

Как правило, языки сценариев будут медленнее, хотя, по крайней мере, большую часть времени.

Ответ 4

Если вам нужна скорость в Python, особенно для сложных алгоритмов, обычно помогает Psyco. На своей веб-странице:

Подумайте о Psyco как о каком-то компилятор точно в срок (JIT), немного бит, как то, что существует для других языки, которые испускают машинный код на муха вместо того, чтобы Python шаг за шагом. разница с традиционным подход к компиляторам JIT заключается в том, что Psyco пишет несколько версий одинаковые блоки (блок - это бит функция), которые оптимизированы будучи специализированным для некоторых видов переменные ( "вид" может означать тип, но он более общий). В результате что ваши немодифицированные программы Python бегите быстрее.

от 2x до 100x ускорений, обычно 4x, с немодифицированным интерпретатором Python и немодифицированный исходный код, просто динамически загружаемое расширение C модуль.

Как ни странно, он не упоминался в приведенных выше ссылках.

Ответ 5

Очень сложно сделать действительно объективное и общее сравнение скорости выполнения на двух языках. При сравнении любых двух языков X и Y часто обнаруживается, что X в некоторых отношениях быстрее, чем Y, а в других - медленнее. Для меня это делает любые доступные тесты или сравнения доступными в Интернете в основном бесполезными. Лучший способ - проверить его самостоятельно и посмотреть, насколько быстро каждый язык предназначен для работы, которую вы выполняете.

Сказав это, есть некоторые вещи, которые следует помнить при тестировании языков, таких как Java и Python. Код на этих языках часто можно значительно ускорить, используя конструкции, более подходящие для языка (например, списки в Python или с помощью char [] и StringBuilder для определенных операций String в Java). Более того, для Python использование psyco может значительно повысить скорость работы программы. И тогда возникает целая проблема использования соответствующих структур данных и слежения за сложностью кода во время выполнения.

Ответ 6

Я думаю, что ответ Кейла (среди прочих) приносит домой основной момент: огромная сумма зависит от того, как вы делаете. Эта ссылка дала два ответа для С++, но я с трудом верю, что кто-то обычно пишет С++, что очень похоже на одно. Моя первая попытка будет выглядеть примерно так:

#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, но любой, кто хочет, может легко изменить это).

Есть несколько моментов по этому поводу, которые поражают меня как интересные. Во-первых, код стал намного короче - на самом деле, конкурентоспособным, как самый короткий показанный код. Во-вторых, код стал намного быстрее - вероятно, быстрее, чем что-либо, кроме специально оптимизированной версии на С++.

Наконец, по крайней мере, мне кажется, что код стал немного легче читать и понимать. Для меня его "крик()" казался довольно запутанным, так как "Лицо" действительно было node в связанном списке объектов Person, а Chain обрабатывает некоторые из связанных ссылок, но "Person" также делает связанные вещи списка вместе с вещами "Человек".

Это не обязательно (или напрямую) говорит нам о скорости Python, но я думаю, что это дает представление о качестве многих тестов, которые вы можете найти в Интернете. Написание почти любых эталонных тестов, которые значимы и точны, чрезвычайно сложны - и попытка сравнения между языками является одним из самых сложных из них.

Ответ 7

Это вопрос, на который вы не можете ответить должным образом, потому что все зависит от того, когда он должен быть быстрым. Java хорош для огромных серверов, это плохо, когда вам приходится повторно компилировать и тестировать много раз ваш код (компиляция sooooooo slow). Python даже не нужно компилировать для тестирования!

В производственной среде совершенно глупо говорить, что Java быстрее, чем C... это похоже на то, что C быстрее, чем сборка.

Во всяком случае, невозможно точно ответить: все зависит от того, что вы хотите/нуждаетесь.

Ответ 8

Для Python скорость зависит также и от реализаций интерпретатора... Я видел, что pypy обычно быстрее, чем cpython.