我知道内联,根据我的检查,它不是由 Python 的编译器完成的。
我的问题是:python 的编译器是否有任何优化转换:
print myList.__len__()
for i in range(0, myList.__len__()):
print i + myList.__len__()
到
l = myList.__len__()
print l
for i in range(0, l):
print i + l
那么是编译器做的吗?
如果不是:值得我自己做吗?
奖金问题(不那么相关):我喜欢有很多功能(恕我直言,可读性更好)...就像 Python 中没有内联,这是要避免的事情(很多功能)吗?
最佳答案
不,没有。您可以通过使用 dis
模块将代码编译为字节码来检查 Python 做了什么:
>>> def test():
... print myList.__len__()
... for i in range(0, myList.__len__()):
... print i + myList.__len__()
...
>>> import dis
>>> dis.dis(test)
2 0 LOAD_GLOBAL 0 (myList)
3 LOAD_ATTR 1 (__len__)
6 CALL_FUNCTION 0
9 PRINT_ITEM
10 PRINT_NEWLINE
3 11 SETUP_LOOP 44 (to 58)
14 LOAD_GLOBAL 2 (range)
17 LOAD_CONST 1 (0)
20 LOAD_GLOBAL 0 (myList)
23 LOAD_ATTR 1 (__len__)
26 CALL_FUNCTION 0
29 CALL_FUNCTION 2
32 GET_ITER
>> 33 FOR_ITER 21 (to 57)
36 STORE_FAST 0 (i)
4 39 LOAD_FAST 0 (i)
42 LOAD_GLOBAL 0 (myList)
45 LOAD_ATTR 1 (__len__)
48 CALL_FUNCTION 0
51 BINARY_ADD
52 PRINT_ITEM
53 PRINT_NEWLINE
54 JUMP_ABSOLUTE 33
>> 57 POP_BLOCK
>> 58 LOAD_CONST 0 (None)
61 RETURN_VALUE
如您所见,__len__
属性每次都会被查找和调用。
Python 无法知道给定方法在两次调用之间会返回什么,__len__
方法也不异常(exception)。如果 python 试图通过假设返回的值在调用之间是相同的来优化它,你会遇到无数不同的问题,我们甚至还没有尝试使用多线程。
请注意,您最好使用 len(myList)
,而不是直接调用 __len__()
Hook :
print len(myList)
for i in xrange(len(myList):
print i + len(myList)
关于python - 保存我多次使用的列表的长度是否更好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13381213/