Вид Python () метод в списке по сравнению с отсортированным встроенным () функция

Используя gc модуль, интерфейс к кишкам сборщика "мусора", можно звонить gc.get_referrers(foo) для получения списка всего относящегося к foo.

Следовательно, len(gc.get_referrers(foo)) даст Вам длину того списка: количество ссылающихся доменов, которое является тем, что Вы после.

См. также gc документация модуля .

33
задан 2 revs 17 September 2009 в 07:16
поделиться

3 ответа

Ваша ошибка измерения выглядит следующим образом: после вашего первого вызова test_list1.sort () этот объект списка IS отсортирован - и сортировка Python, aka timsort , ужасно быстро в уже отсортированных списках !!! Который' s самая частая ошибка при использовании timeit - непреднамеренное получение побочных эффектов без их учета.

Вот хороший набор измерений с использованием timeit из командной строки, поскольку он лучше всего использовать:

$ python -mtimeit -s'import random; x=range(1000); random.shuffle(x)' '
y=list(x); y.sort()'
1000 loops, best of 3: 452 usec per loop
$ python -mtimeit -s'import random; x=range(1000); random.shuffle(x)' '
x.sort()'
10000 loops, best of 3: 37.4 usec per loop
$ python -mtimeit -s'import random; x=range(1000); random.shuffle(x)' '
sorted(x)'
1000 loops, best of 3: 462 usec per loop

Как видите, y.sort () и sorted (x) являются шейкой и шейкой, но x.sort () спасибо к побочным эффектам выигрывает на порядок - только из-за вашей ошибки измерения: это ничего не говорит вам о sort vs sorted как таковом! -)

sort () и sorted (x) - это шея и шея, но x.sort () благодаря побочным эффектам превосходит преимущество на порядок - просто потому, что ошибки измерения: это ничего не говорит вам о sort vs sorted как таковом! -)

sort () и sorted (x) - это шея и шея, но x.sort () благодаря побочным эффектам превосходит преимущество на порядок - просто потому, что ошибки измерения: это ничего не говорит вам о sort vs sorted как таковом! -)

51
ответ дан 27 November 2019 в 18:03
поделиться

Поскольку list.sort выполняет сортировку по месту, поэтому в первый раз он сортирует, но в следующий раз вы сортируете отсортированный список.

например, попробуйте это, и вы получите те же результаты в случае, если большая часть времени тратится на копирование, сортировка также делает еще одну копию

import time
import random
test_list1=random.sample(xrange(1000),1000)
test_list2=random.sample(xrange(1000),1000)

s=time.time()
for i in range(100):
    test_list1.sort()
print time.time()-s

s=time.time()
for i in range(100):
    test_list2=sorted(test_list2)
print time.time()-s
11
ответ дан 27 November 2019 в 18:03
поделиться

Итак, метод списков .sort () сортирует список на месте, а sorted () создает новый список. Так что, если у вас большой список, часть вашей разницы в производительности будет из-за копирования.

Тем не менее, разница на порядок больше, чем я ожидал. Возможно, list.sort () имеет специальную оптимизацию, которую sorted () не может использовать. Например, поскольку класс list уже имеет внутренний массив Py_Object * [] нужного размера, возможно, он сможет выполнять свопинг более эффективно.

Изменить : Alex и Анураг правы, разница по порядку величины связана с тем, что вы случайно отсортировали уже отсортированный список в вашем тестовом примере. Однако, как показывают тесты Алекса, список .

7
ответ дан 27 November 2019 в 18:03
поделиться
Другие вопросы по тегам:

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