Используя gc
модуль, интерфейс к кишкам сборщика "мусора", можно звонить gc.get_referrers(foo)
для получения списка всего относящегося к foo
.
Следовательно, len(gc.get_referrers(foo))
даст Вам длину того списка: количество ссылающихся доменов, которое является тем, что Вы после.
См. также gc
документация модуля .
Ваша ошибка измерения выглядит следующим образом: после вашего первого вызова 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
как таковом! -)
sorted (x)
- это шея и шея, но x.sort ()
благодаря побочным эффектам превосходит преимущество на порядок - просто потому, что ошибки измерения: это ничего не говорит вам о sort
vs sorted
как таковом! -) sort () и sorted (x)
- это шея и шея, но x.sort ()
благодаря побочным эффектам превосходит преимущество на порядок - просто потому, что ошибки измерения: это ничего не говорит вам о sort
vs sorted
как таковом! -) Поскольку 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
Итак, метод списков .sort ()
сортирует список на месте, а sorted ()
создает новый список. Так что, если у вас большой список, часть вашей разницы в производительности будет из-за копирования.
Тем не менее, разница на порядок больше, чем я ожидал. Возможно, list.sort ()
имеет специальную оптимизацию, которую sorted ()
не может использовать. Например, поскольку класс list
уже имеет внутренний массив Py_Object * []
нужного размера, возможно, он сможет выполнять свопинг более эффективно.
Изменить : Alex и Анураг правы, разница по порядку величины связана с тем, что вы случайно отсортировали уже отсортированный список в вашем тестовом примере. Однако, как показывают тесты Алекса, список .