Почему начинается медленнее, чем нарезка

Почему реализация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 для анализа данных (Глава 3), но никаких объяснений этому не предлагается ..

Если полезно:вот код C дляstartswith; и вот вывод:dis.dis

In [6]: import dis

In [7]: dis_it = lambda x: dis.dis(compile(x, '', '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 

Ответы на вопрос(5)

Ваш ответ на вопрос