python - 保存我多次使用的列表的长度是否更好?

标签 python list

我知道内联,根据我的检查,它不是由 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/

相关文章:

python - 字典创建说明

java - list.add 覆盖以前的对象

java - 从列表中获取任何元素

python - 如何在 python 中使用具有不同数量空格的正则表达式

python - 简单的 Django 项目结构

python+docker : docker volume mounting with bad perms, 数据默默丢失

c# - 检查值是否是 C# 中一组值中的一个的最简单方法?

python - 将列表映射到 1 和 0

python-3.x - Python 中列表的单行清理/操作

python - 单击selenium python后从菜单中选择