Почему реализация startwith
медленнее, чем нарезка?
In [1]: x = 'foobar'
In [2]: y = 'foo'
In [3]: %timeit x.startswith(y)
1000000 loops, best of 3: 321 ns per loop
In [4]: %timeit x[:3] == y
10000000 loops, best of 3: 164 ns per loop
Удивительно, но даже с учетом расчета длины нарезка все равно выполняется значительно быстрее:
In [5]: %timeit x[:len(y)] == y
1000000 loops, best of 3: 251 ns per loop
Примечание: первая часть этого поведения отмечена в Python для анализа данных strong> (глава 3), но никаких объяснений этому не дается.
.
Если полезно: вот код C для startswith
; и вот результат dis.dis
:
In [6]: import dis
In [7]: dis_it = lambda x: dis.dis(compile(x, '<none>', 'eval'))
In [8]: dis_it('x[:3]==y')
1 0 LOAD_NAME 0 (x)
3 LOAD_CONST 0 (3)
6 SLICE+2
7 LOAD_NAME 1 (y)
10 COMPARE_OP 2 (==)
13 RETURN_VALUE
In [9]: dis_it('x.startswith(y)')
1 0 LOAD_NAME 0 (x)
3 LOAD_ATTR 1 (startswith)
6 LOAD_NAME 2 (y)
9 CALL_FUNCTION 1
12 RETURN_VALUE
startswith
, вы можете передать параметрыstart
иend
, это требует времени. - person SilentGhost   schedule 07.11.2012