Мне интересно, почему repr(int)
быстрее, чем str(int)
. С помощью следующего фрагмента кода:
ROUNDS = 10000
def concat_strings_str():
return ''.join(map(str, range(ROUNDS)))
def concat_strings_repr():
return ''.join(map(repr, range(ROUNDS)))
%timeit concat_strings_str()
%timeit concat_strings_repr()
Я получаю эти тайминги (python 3.5.2, но очень похожие результаты с 2.7.12):
1.9 ms ± 17.9 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
1.38 ms ± 9.07 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
Если я нахожусь на правильном пути, ту же самую функцию long_to_decimal_string
вызывается под капотом.
Я получил что-то не так, или что еще происходит, что мне не хватает?
Обновление:
Вероятно, это не имеет ничего общего с методами int
__repr__
или __str__
, но с различиями между repr()
и str()
, поскольку int.__str__
и int.__repr__
на самом деле сравнительно быстро:
def concat_strings_str():
return ''.join([one.__str__() for one in range(ROUNDS)])
def concat_strings_repr():
return ''.join([one.__repr__() for one in range(ROUNDS)])
%timeit concat_strings_str()
%timeit concat_strings_repr()
приводит к:
2.02 ms ± 24.3 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
2.05 ms ± 7.07 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)