Мне было любопытно, есть ли какие-либо признаки того, какой из operator.itemgetter(0)
или lambda x:x[0]
лучше использовать, в частности, в sorted()
как аргумент ключевого слова key
, так как использование, которое возникает с первого взгляда. Существуют ли какие-либо известные отличия в производительности? Существуют ли какие-либо предпочтения, связанные с ППС, или рекомендации по этому вопросу?
Operator.itemgetter или лямбда
Ответ 1
Производительность itemgetter немного лучше:
>>> f1 = lambda: sorted(w, key=lambda x: x[1])
>>> f2 = lambda: sorted(w, key=itemgetter(1))
>>> timeit(f1)
21.33667682500527
>>> timeit(f2)
16.99106214600033
Ответ 2
Оставив в стороне проблему скорости, которая часто основана на том, где вы делаете элемент itemgetter или лямбда-функционал, я лично считаю, что itemgetter
действительно приятно получить сразу несколько элементов: например, itemgetter(0, 4, 3, 9, 19, 20)
создаст функцию который возвращает кортеж элементов по указанным индексам перечислимого объекта, переданного ему. Чтобы сделать это с помощью лямбда, вам понадобится lambda x:x[0], x[4], x[3], x[9], x[19], x[20]
, что намного clunkier. (И тогда некоторые пакеты, такие как numpy
, имеют расширенную индексацию, которая очень похожа на itemgetter()
, за исключением встроенной в стандартную нотацию).
Ответ 3
Согласно моему itemgetter
в списке из 1000 кортежей, использование itemgetter
почти в два раза itemgetter
чем простой lambda
метод. Вот мой код:
In [1]: a = list(range(1000))
In [2]: b = list(range(1000))
In [3]: import random
In [4]: random.shuffle(a)
In [5]: random.shuffle(b)
In [6]: c = list(zip(a, b))
In [7]: %timeit c.sort(key=lambda x: x[1])
81.4 µs ± 433 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
In [8]: random.shuffle(c)
In [9]: from operator import itemgetter
In [10]: %timeit c.sort(key=itemgetter(1))
47 µs ± 202 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
Я также проверил производительность (время выполнения в мкс) этих двух методов для различных размеров списка.
+-----------+--------+------------+
| List size | lambda | itemgetter |
+-----------+--------+------------+
| 100 | 8.19 | 5.09 |
+-----------+--------+------------+
| 1000 | 81.4 | 47 |
+-----------+--------+------------+
| 10000 | 855 | 498 |
+-----------+--------+------------+
| 100000 | 14600 | 10100 |
+-----------+--------+------------+
| 1000000 | 172000 | 131000 |
+-----------+--------+------------+
(Код, создающий изображение выше, можно найти здесь)
В сочетании с лаконичностью выбора нескольких элементов из списка, itemgetter
, itemgetter
является победителем для использования в методе сортировки.