Что означает 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 69

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.

обратное цитирование обычно бесполезно и ушло в Python 3.

для чего это стоит, это:

''.join(map(repr, xrange(10000000)))

немного быстрее, чем версия backtick для меня. Но переживать по этому поводу вероятно, это преждевременная оптимизация.

мое предположение заключается в том, что num не определяет способ __str__(), Так что str() должен сделать второй поиск для __repr__.

задние палочки смотрят прямо на __repr__. Если это правда, то с помощью repr() вместо обратные кавычки должны дать вам те же результаты.