Чтобы выполнить несколько тестов на моем недавно установленном 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 медленным или что-то не так с моей инсталляцией?
Глядя на ваш код 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 использует целые числа.
Небольшая выдержка из 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). "
blockquote>