Отвечая на другой вопрос, я предложил использовать timeit
для проверки разницы между индексированием списка с положительными целыми числами и отрицательными целыми числами. Вот код:
import timeit
t=timeit.timeit('mylist[99]',setup='mylist=list(range(100))',number=10000000)
print (t)
t=timeit.timeit('mylist[-1]',setup='mylist=list(range(100))',number=10000000)
print (t)
Я запустил этот код с Python 2.6:
$ python2.6 test.py
0.587687015533
0.586369991302
Затем я запустил его с помощью Python 3.2:
$ python3.2 test.py
0.9212150573730469
1.0225799083709717
Потом я почесал голову, немного поискал в гугле и решил опубликовать эти наблюдения здесь.
Операционная система: OS-X (10.5.8) -- Intel Core2Duo
Мне кажется, это довольно существенная разница (разница более чем в 1,5 раза). Кто-нибудь знает, почему python3 намного медленнее, особенно для такой распространенной операции?
ИЗМЕНИТЬ
Я запустил тот же код на своем рабочем столе Ubuntu Linux (Intel i7) и добился сравнимых результатов с python2.6 и python 3.2. Похоже, что это проблема, зависящая от операционной системы (или процессора) (другие пользователи наблюдают такое же поведение на компьютерах с Linux — см. комментарии).
ИЗМЕНИТЬ 2
Баннер запуска был запрошен в одном из ответов, так что вот:
Python 2.6.4 (r264:75821M, Oct 27 2009, 19:48:32)
[GCC 4.0.1 (Apple Inc. build 5493)] on darwin
а также:
Python 3.2 (r32:88452, Feb 20 2011, 10:19:59)
[GCC 4.0.1 (Apple Inc. build 5493)] on darwin
ОБНОВЛЕНИЕ
Я только что установил свежие версии python2.7.3 и python3.2.3 с сайта http://www.python.org/download/
В обоих случаях я взял
«Python xx3 Mac OS X 32-разрядная программа установки i386/PPC (для Mac OS X 10.3–10.6 [2])»
так как я на OS X 10.5. Вот новые тайминги (которые достаточно стабильны после нескольких испытаний):
питон 2.7
$python2.7 test.py
0.577006101608
0.590042829514
питон 3.2.3
$python3.2 test.py
0.8882801532745361
1.034242868423462
xrange()
в python 2.x - person Ashwini Chaudhary   schedule 09.07.2012setup
, которое не рассчитано по времени.xrange
противrange
не должно иметь к этому никакого отношения. - person mgilson   schedule 09.07.2012mylist[99]
/mylist[-1]
mylist
будет просто списком чисел,[0, 1, ..., 99]
. Иrange
, иxrange
должны производить одинаковые входные данные для вызоваstmt
, что на самом деле рассчитано по времени. - person DSM   schedule 09.07.2012