Что означает backticks для интерпретатора python: 'num`
Я играю с пониманием списка, и я наткнулся на этот маленький фрагмент на другом сайте:
return ''.join([`num` for num in xrange(loop_count)])
Я потратил несколько минут, пытаясь воспроизвести функцию (набрав), прежде чем реализовать `num`
- чуть было не разбив его.
что делает включение оператора в эти символы? Из того, что я вижу, это эквивалент str(num). Но когда я приурочил его:
return ''.join([str(num) for num in xrange(10000000)])
это занимает 4.09 s тогда как:
return ''.join([`num` for num in xrange(10000000)])
принимает 2.43 сек.
оба дают одинаковые результаты, но намного медленнее. Что здесь происходит?
EDIT: странно... repr()
дает немного более медленные результаты, чем `num`
. 2.99 s против 2.43 сек. С помощью Python 2.6 (3.0 еще не пробовал).
3 ответа:
Backticks-это устаревший псевдоним для
repr()
. Не используйте их больше, синтаксис был удален в Python 3.0.С помощью обратных палочек, кажется, быстрее, чем с помощью
repr(num)
илиnum.__repr__()
в версии 2.x. я думаю, это потому, что дополнительный поиск словаря требуется в глобальном пространстве имен (дляrepr
), или в пространстве имен объекта (для__repr__
), соответственно.
С помощью
dis
модуль доказывает мою предположение:def f1(a): return repr(a) def f2(a): return a.__repr__() def f3(a): return `a`
демонтировать показывает:
>>> import dis >>> dis.dis(f1) 3 0 LOAD_GLOBAL 0 (repr) 3 LOAD_FAST 0 (a) 6 CALL_FUNCTION 1 9 RETURN_VALUE >>> dis.dis(f2) 6 0 LOAD_FAST 0 (a) 3 LOAD_ATTR 0 (__repr__) 6 CALL_FUNCTION 0 9 RETURN_VALUE >>> dis.dis(f3) 9 0 LOAD_FAST 0 (a) 3 UNARY_CONVERT 4 RETURN_VALUE
f1
включает в себя глобальный поиск дляrepr
,f2
поиск атрибут для__repr__
, тогда как оператор backtick реализован в отдельном коде операции. Поскольку нет накладных расходов для поиска словаря (LOAD_GLOBAL
/LOAD_ATTR
), а также для вызовов функций (CALL_FUNCTION
), задние палочки быстрее.я думаю, что люди Python решили, что у них есть отдельная низкоуровневая операция для
repr()
не стоит, и какrepr()
и backticks нарушает принцип"должен быть один-и, желательно, только один-очевидный способ сделать это"
Итак, функция была удалена в Python 3.0.