2024-03-28 12:34:31 发布
网友
在python中,使用comprehensive还是使用独立函数生成列表,成本会更高?在
看来我没能找到以前的帖子问同样的问题。虽然其他的答案会详细介绍python的字节和内部工作原理,这确实很有帮助,但我觉得可视化图形有助于显示出一种持续的趋势。在
我对python的底层工作原理还没有足够的了解,所以这些答案对我来说有点陌生,我想尝试去理解。在
我现在是一名计算机科学专业的本科生,我一直惊讶于python的强大功能。我最近做了一个小实验,测试用理解和独立函数形成列表的成本。例如:
def make_list_of_size(n): retList = [] for i in range(n): retList.append(0) return retList
创建一个包含0的大小为n的列表。在
众所周知,这个函数是O(n)。我想探讨以下方面的发展:
这是同一张单子。在
让我们探索吧!在
这是我用来计时的代码,并记下函数调用的顺序(我是以哪种方式首先列出列表的)。我先用一个独立的函数列了这个列表,然后用理解。我还没有学会如何在这个实验中关闭垃圾收集,所以,当垃圾收集开始时,会带来一些固有的度量错误。在
''' 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
见绘图:
Overlay with NO ZOOM
我发现这些结果很有趣。尽管这两种方法都有一个O(n)的大O表示法,但是对于时间而言,制作同一个列表所需的成本相对较小。在
我有更多的信息要分享,包括同一个测试所做的列表首先与理解,然后与独立的功能。在
我还没有运行一个没有垃圾回收的测试。在
我现在是一名计算机科学专业的本科生,我一直惊讶于python的强大功能。我最近做了一个小实验,测试用理解和独立函数形成列表的成本。例如:
创建一个包含0的大小为n的列表。在
众所周知,这个函数是O(n)。我想探讨以下方面的发展:
^{pr2}$这是同一张单子。在
让我们探索吧!在
这是我用来计时的代码,并记下函数调用的顺序(我是以哪种方式首先列出列表的)。我先用一个独立的函数列了这个列表,然后用理解。我还没有学会如何在这个实验中关闭垃圾收集,所以,当垃圾收集开始时,会带来一些固有的度量错误。在
我做了三次测试。其中两个的列表大小是100000,第三个是1*10^6
见绘图:
Overlay with NO ZOOM
我发现这些结果很有趣。尽管这两种方法都有一个O(n)的大O表示法,但是对于时间而言,制作同一个列表所需的成本相对较小。在
我有更多的信息要分享,包括同一个测试所做的列表首先与理解,然后与独立的功能。在
我还没有运行一个没有垃圾回收的测试。在
相关问题 更多 >
编程相关推荐