Ответ 1
Я еще не работал над python3.3. Все, что я изложил ниже, основано на наблюдении.
Я использовал дизассемблер python для следующего кода в python 3.3 и python 2.7.3.
s = """
''.join([n for n in ('1', '2', '3')])
"""
Я обнаружил, что есть изменения в повышающих кодах.
Python 2.7.3
Python 2.7.3 (default, Apr 10 2012, 23:31:26) [MSC v.1500 32 bit (Intel)] on win
32
Type "help", "copyright", "credits" or "license" for more information.
>>> import dis
>>> from timeit import timeit
>>> s = """
... ''.join([n for n in ('1', '2', '3')])
... """
>>> timeit(s, number=100000)
0.08443676085287867
>>>
>>>
>>> c = compile(s, '<string>', 'exec')
>>> dis.dis(c)
2 0 LOAD_CONST 0 ('')
3 LOAD_ATTR 0 (join)
6 BUILD_LIST 0
9 LOAD_CONST 5 (('1', '2', '3'))
12 GET_ITER
>> 13 FOR_ITER 12 (to 28)
16 STORE_NAME 1 (n)
19 LOAD_NAME 1 (n)
22 LIST_APPEND 2
25 JUMP_ABSOLUTE 13
>> 28 CALL_FUNCTION 1
31 POP_TOP
32 LOAD_CONST 4 (None)
35 RETURN_VALUE
>>>
python 3.3
Python 3.3.0 (v3.3.0:bd8afb90ebf2, Sep 29 2012, 10:55:48) [MSC v.1600 32 bit (In
tel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import dis
>>> from timeit import timeit
>>> s = """
... ''.join([n for n in ('1', '2', '3')])
... """
>>> timeit(s, number=100000)
0.13603410021487614
>>>
>>>
>>> c = compile(s, '<string>', 'exec')
>>> dis.dis(c)
2 0 LOAD_CONST 0 ('')
3 LOAD_ATTR 0 (join)
6 LOAD_CONST 1 (<code object <listcomp> at 0x01F70BB
0, file "<string>", line 2>)
9 LOAD_CONST 2 ('<listcomp>')
12 MAKE_FUNCTION 0
15 LOAD_CONST 7 (('1', '2', '3'))
18 GET_ITER
19 CALL_FUNCTION 1 (1 positional, 0 keyword pair)
22 CALL_FUNCTION 1 (1 positional, 0 keyword pair)
25 POP_TOP
26 LOAD_CONST 6 (None)
29 RETURN_VALUE
>>>
Из повышающих кодов я понял, что это было понимание списка, которое изменилось, поэтому я проверил для понимания списка в обеих версиях
Python 2.7.3
Python 2.7.3 (default, Apr 10 2012, 23:31:26) [MSC v.1500 32 bit (Intel)] on win
32
Type "help", "copyright", "credits" or "license" for more information.
>>>
>>>
>>>
>>> import dis
>>> from timeit import timeit
>>> s = """
... [i for i in ('1', '2', '3')]
... """
>>> timeit(s, number=100000)
0.059500395456104374
>>> c = compile(s, '<string>', 'exec')
>>> dis.dis(c)
2 0 BUILD_LIST 0
3 LOAD_CONST 4 (('1', '2', '3'))
6 GET_ITER
>> 7 FOR_ITER 12 (to 22)
10 STORE_NAME 0 (i)
13 LOAD_NAME 0 (i)
16 LIST_APPEND 2
19 JUMP_ABSOLUTE 7
>> 22 POP_TOP
23 LOAD_CONST 3 (None)
26 RETURN_VALUE
>>>
python 3.3
Python 3.3.0 (v3.3.0:bd8afb90ebf2, Sep 29 2012, 10:55:48) [MSC v.1600 32 bit (In
tel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>>
>>>
>>>
>>> import dis
>>> from timeit import timeit
>>> s = """
... [i for i in ('1', '2', '3')]
... """
>>> timeit(s, number=100000)
0.09876976988887567
>>> c = compile(s, '<string>', 'exec')
>>> dis.dis(c)
2 0 LOAD_CONST 0 (<code object <listcomp> at 0x01FF0BB
0, file "<string>", line 2>)
3 LOAD_CONST 1 ('<listcomp>')
6 MAKE_FUNCTION 0
9 LOAD_CONST 6 (('1', '2', '3'))
12 GET_ITER
13 CALL_FUNCTION 1 (1 positional, 0 keyword pair)
16 POP_TOP
17 LOAD_CONST 5 (None)
20 RETURN_VALUE
>>>
Я не работал с python3 или проверял изменения. Похоже, что реализация понимания списка была изменена. В python3.3 есть MAKE_FUNCTION и CALL_FUNCTION. (Теперь в python2.7 вызов функции стоит дорого. Я не уверен, что вызов функции python3.3 все же стоит дорого или нет. Если это случай, то это может добавить некоторое время.)