Почему python так медленно работает на Raring?

Чтобы выполнить несколько тестов на моем недавно установленном 13.04, я написал приведенный ниже скрипт fibonacci на python. Он в основном принимает число и начинает обрабатывать числа Фибоначчи много раз:

#!/usr/bin/python
import time
from time import time

def fibo(n):
    a,b,i=0,1,0
    while i<n:
        #print b
        a,b = b,b+a
        i+=1


if __name__ == "__main__":
    s=time()
    fibo(1000000)
    print round((time()-s)*1000,0),"ms"

Однако, когда функция fibo () вызывается с параметром 1 миллион, кажется, что питон зависает. В то время как этот подобный код в Java запускается мгновенно:

class fibonacci
{
    private static void fibo(int n)
    {
        int a=0,b=1,i=0;
        while( i<n)
        {
            //print b
            int t=a;
            a=b;
            b=b+t;
            i++;
        }
    }   

    public static void main(String[] args)
    {
        float s=System.currentTimeMillis();
        fibo(1000000);
        System.out.println( (System.currentTimeMillis()-s) + "ms");
    }
}

В чем причина? Является ли python медленным или что-то не так с моей инсталляцией?

-2
задан 21 June 2013 в 18:17

2 ответа

Глядя на ваш код Java, я замечаю, что вы используете int для чисел Фибоначчи. С другой стороны, Python использует произвольную точность .

Также обратите внимание, что числа Фибоначчи не помещаются в переменную int для n > 46! Так что код Java даже не вычисляет числа Фибоначчи для n > 46.

Вы должны изменить int для некоторого большего типа данных (возможно, с произвольной точностью), прежде чем проводить сравнение.

Заключение: Java работает намного быстрее, потому что вычисляет с помощью целых чисел (тип данных фиксированного размера), в то время как Python использует все больше ОЗУ для накопления для постоянно растущих чисел (которые в конечном итоге перестают помещаться в 32-разрядном целое число).

Попробуйте:

#!/usr/bin/python
from time import time

def int32(x):
    x &= 0xffffffff
    if x > 0x7fffffff:
        return - ( ~(x - 1) & 0xffffffff )
    else:
        return x

def fibo(n):
    a,b,i=0,1,0
    while i<n:
        t = a
        a = b
        b = int32(b + t)
        i+=1


if __name__ == "__main__":
    s=time()
    fibo(1000000)
    print round((time()-s)*1000,0),"ms"

, чтобы узнать, сколько примерно времени потребуется, если Python использует целые числа.

0
ответ дан 21 June 2013 в 18:17

Небольшая выдержка из http://www.python.org/doc/essays/comparisons.html должна ответить на ваш вопрос.
Краткий ответ приведен в первом предложении;)

«Обычно ожидается, что программы на Python будут работать медленнее, чем программы на Java, но их разработка занимает гораздо меньше времени. Обычно программы на Python работают в 3-5 раз короче, чем эквивалентные Java-программы. Это различие можно отнести к встроенным высокоуровневым типам данных Python и его динамической типизации. Например, программист Python не тратит время на объявление типов аргументов или переменных, а также мощный полиморфный список и словарь Python типы, для которых богатая синтаксическая поддержка встроена прямо в язык, находят применение почти в каждой программе Python. Из-за типизации во время выполнения среда выполнения Python должна работать тяжелее, чем Java. Например, при оценке выражения a + b , он должен сначала проверить объекты a и b, чтобы выяснить их тип, который неизвестен во время компиляции, а затем вызвать соответствующую операцию сложения, которая может быть перегруженным определяемым пользователем методом. С другой стороны, Java может в формирует эффективное сложение целых чисел или чисел с плавающей запятой, но требует объявления переменных для a и b и не допускает перегрузки оператора + для экземпляров пользовательских классов.

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

0
ответ дан 21 June 2013 в 18:17

Другие вопросы по тегам:

Похожие вопросы: