Моей первой мыслью было, что ноутбук, который у меня под рукой, Macbook Pro, должен быть сопоставим, но немного лучше вашего компьютера - мне не хватает вашего окружающего кода, чтобы попробовать ваш пример C (что vec_t и т. д., и т. д.), но запуск Python, который вы написали, дает мне:
$ python -mtimeit -s'import inso' 'inso.insort(inso.li)'
10 loops, best of 3: 7.21 msec per loop
против ваших 8,1 секунд. Вот вам код, вставленный в insort.py
, которому предшествует:
import random
li = [random.randrange(10000) for _ in xrange(10000)]
array
не помогает - на самом деле все немного замедляется. Затем я установил psyco , JIT-помощник Python (только для x86, только для 32-битной версии), далее добавил:
import psyco
psyco.full()
и получил:
$ python -mtimeit -s'import inso' 'inso.insort(inso.li)'
10 loops, best of 3: 207 usec per loop
так что ускорение примерно на 7,21 / 0,000207 = 34830 раз - против 8,04 / 0,13 = 62 раза, которое вас так удивило; -).
Конечно, проблема в том, что после первого раза список уже отсортирован, поэтому insort становится быстрее. Вы не дали нам достаточно окружающего тестового жгута, чтобы точно знать, что вы измерили. Более реалистичный пример (где фактический список не затрагивается, поэтому он остается неупорядоченным, сортируется только копия ...), без psyco:
$ python -mtimeit -s'import inso' 'inso.insort(list(inso.li))'
10 loops, best of 3: 13.8 sec per loop
Упс - значит, ваша машина ПУТЬ быстрее, чем Macbook Pro (помните, ядро не в счет: мы здесь используем только одну ;-) - вау ... или вы ошибаетесь. Во всяком случае, с психо:
$ python -mtimeit -s'import inso' 'inso.insort(list(inso.li))'
10 loops, best of 3: 456 msec per loop
Таким образом, ускорение psyco составляет всего 13.8 / 0.456, в 30 раз - примерно вдвое больше, чем в 60+ раз, когда вы используете кодирование на чистом C. Итак, вы ожидаете, что python + psyco будет в два раза медленнее, чем чистый C. Это более реалистичная и типичная оценка.
Если вы пишете достаточно высокоуровневый код, его ускорение может снизиться с (скажем) в 30 раз до гораздо меньшего - но также и преимущество Си по сравнению с Python. Например,
$ python -mtimeit -s'import inso' 'sorted(inso.li)'
100 loops, best of 3: 8.72 msec per loop
без психо (в данном случае психо на самом деле - незначительно - замедляет исполнение ;-), так что это еще один фактор - 52 по сравнению с психо, 1582 в целом по сравнению с непсихопсихологами.
Но когда по тем или иным причинам вам нужно написать крайне низкоуровневые алгоритмы на python, а не использовать всестороннюю поддержку со стороны buildins и stdlib, psyco может помочь уменьшить боль.
Еще один момент, когда вы проводите тестирование, пожалуйста, опубликуйте ВСЕ код, чтобы другие могли точно увидеть, что вы делаете (и, возможно, заметили ошибки) - ваши "леса" такие хитрые и могут скрыть ловушки, как код, который вы думаете вы измеряете! -)