Python:使用comprehension和独立函数形成列表的成本

2024-03-28 12:34:31 发布

您现在位置:Python中文网/ 问答频道 /正文

在python中,使用comprehensive还是使用独立函数生成列表,成本会更高?在

看来我没能找到以前的帖子问同样的问题。虽然其他的答案会详细介绍python的字节和内部工作原理,这确实很有帮助,但我觉得可视化图形有助于显示出一种持续的趋势。在

我对python的底层工作原理还没有足够的了解,所以这些答案对我来说有点陌生,我想尝试去理解。在


Tags: 函数答案图形列表字节可视化趋势帖子
1条回答
网友
1楼 · 发布于 2024-03-28 12:34:31

我现在是一名计算机科学专业的本科生,我一直惊讶于python的强大功能。我最近做了一个小实验,测试用理解和独立函数形成列表的成本。例如:

def make_list_of_size(n):
    retList = []
    for i in range(n):
        retList.append(0)
    return retList

创建一个包含0的大小为n的列表。在

众所周知,这个函数是O(n)。我想探讨以下方面的发展:

^{pr2}$

这是同一张单子。在

让我们探索吧!在

这是我用来计时的代码,并记下函数调用的顺序(我是以哪种方式首先列出列表的)。我先用一个独立的函数列了这个列表,然后用理解。我还没有学会如何在这个实验中关闭垃圾收集,所以,当垃圾收集开始时,会带来一些固有的度量错误。在

'''
file: listComp.py
purpose: to test the cost of making a list with comprehension
versus a standalone function
'''
import time as T
def get_overhead(n):
    tic = T.time()
    for i in range(n):
        pass
    toc = T.time()
    return toc - tic


def make_list_of_size(n):
    aList = [] #<  O(1)
    for i in range(n): #<  O(n)
        aList.append(n) #<  O(1)
    return aList #<  O(1)

def comprehension(n):
    return [n for i in range(n)] #<  O(?)

def do_test(size_i,size_f,niter,file):
    delta = 100
    size = size_i
    while size <= size_f:
        overhead = get_overhead(niter)

        reg_tic = T.time()
        for i in range(niter):
            reg_list = make_list_of_size(size)
        reg_toc = T.time()

        comp_tic = T.time()
        for i in range(niter):
            comp_list = comprehension(size)
        comp_toc = T.time()

        #          

        reg_cost_per_iter = (reg_toc - reg_tic - overhead)/niter
        comp_cost_pet_iter = (comp_toc - comp_tic - overhead)/niter

        file.write(str(size)+","+str(reg_cost_per_iter)+
            ","+str(comp_cost_pet_iter)+"\n")

        print("SIZE: "+str(size)+ " REG_COST = "+str(reg_cost_per_iter)+
            " COMP_COST = "+str(comp_cost_pet_iter))

        if size == 10*delta:
            delta *= 10
        size += delta

def main():
    fname = input()
    file = open(fname,'w')
    do_test(100,1000000,2500,file)
    file.close()

main()

我做了三次测试。其中两个的列表大小是100000,第三个是1*10^6

见绘图:

Cost of Insertion. Ignore left plotCost of Insertion. Ignore left plot

Overlay with NO ZOOM

我发现这些结果很有趣。尽管这两种方法都有一个O(n)的大O表示法,但是对于时间而言,制作同一个列表所需的成本相对较小。在

我有更多的信息要分享,包括同一个测试所做的列表首先与理解,然后与独立的功能。在

我还没有运行一个没有垃圾回收的测试。在

相关问题 更多 >