Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么我的代码要比较两种不同排序算法的运行时多次显示相同的数字?_Python_Performance_Sorting - Fatal编程技术网

Python 为什么我的代码要比较两种不同排序算法的运行时多次显示相同的数字?

Python 为什么我的代码要比较两种不同排序算法的运行时多次显示相同的数字?,python,performance,sorting,Python,Performance,Sorting,我试图比较冒泡排序和插入排序之间的运行时间。它在10个不同的列表上执行此操作,第一个列表包含1000个数字,然后每次增加1000个 下面的循环使用这两种方法创建列表和每个列表的时间。它应该将每次分配给一个列表,然后再分配给另一个列表,因为目标是有一个列表列表,我以后可以将其用作图形的数据点。假设sort_1和sort_2是实现的排序算法 counter = 0 empty_list = [] list_limit = 1000 data_point = [] list_of_data_point

我试图比较冒泡排序和插入排序之间的运行时间。它在10个不同的列表上执行此操作,第一个列表包含1000个数字,然后每次增加1000个

下面的循环使用这两种方法创建列表和每个列表的时间。它应该将每次分配给一个列表,然后再分配给另一个列表,因为目标是有一个列表列表,我以后可以将其用作图形的数据点。假设
sort_1
sort_2
是实现的排序算法

counter = 0
empty_list = []
list_limit = 1000
data_point = []
list_of_data_points = []

while list_limit <= 10000:

    while counter < list_limit:
        num = random.randint(1, 10000)
        empty_list.append(num)
        counter += 1
    
    copied_list = list(empty_list)
    bubble_time = sort_1(copied_list)
    insert_time = sort_2(copied_list)

    data_point.clear()
    data_point.append(bubble_time)
    data_point.append(insert_time)
    list_of_data_points.append(data_point)
    print(list_of_data_points)
    list_limit += 1000
正如你所看到的,它可以很好地计算时间。但是,每次将
数据点
添加到列表中时,似乎都在清除当前列表并使每个数据点具有相同的值


我感到困惑,因为我认为
append()
方法应该只是将当前数据点列表添加到更大的列表中(即,
list\u of_data\u points
。我的while循环是否有问题,或者这是一个我误解的列表问题?

data\u point被清除,然后你附加bubble\u time和insert\u time,bubble\u time与insert\u time相同,但排序方法不同

这意味着您需要两次附加相同的数据(我想您只是以不同的方式对其进行排序),但是,如果这是您想要的,您可以这样做:

data_point = [bubble_time, insert_time] #replace datapoint.clear() with this and don't use the append method
我的英语不是很好,但如果这有帮助,我会很高兴。如果我做错了什么,请随时写评论,这样我就可以尽我所能提供帮助。试试:

随机导入
将numpy作为np导入
数据_点=[]
对于范围(10)内的i:
数量大小=(i+1)*1000
随机数=列表(np.random.randint(低=1,高=1000,大小=num\u size))
气泡时间=len(随机数)
插入时间=长度(随机数)
数据点插入(i,[气泡时间,插入时间])
也许,在这种情况下,使用字典会更好:

随机导入
将numpy作为np导入
数据_dict={}
对于范围(10)内的i:
数量大小=(i+1)*1000
随机数=列表(np.random.randint(低=1,高=1000,大小=num\u size))
气泡时间=总和(随机数)
插入时间=长度(随机数)
数据记录[num\u size]=[bubble\u time,insert\u time]
打印(数据记录)
#打印输出(数据记录)
{'1000': [527103, 1000], '2000': [994513, 2000], '3000': [1490553, 3000], '4000': [2007809, 4000], '5000': [2539145, 5000], '6000': [3039272, 6000], '7000': [3501393, 7000], '8000': [4011519, 8000], '9000': [4526147, 9000], '10000': [5053926, 10000]}
我选择len()和sum()是为了有两个替代函数

使用此dict可以轻松地用正确的标签绘制数据点,例如:

导入matplotlib.pyplot作为plt
lists=排序(data_dict.items())#按键排序,返回元组列表
x、 y=zip(*列表)#将成对列表解压为两个元组
plt.绘图(x,[i[0]表示y中的i])
plt.绘图(x,[i[1]表示y中的i])
plt.show()
这可能看起来有点让人难以接受;我只是想给你一段简洁、实用的代码。如果你对某些方面/行/方法感兴趣,而这些方面/行/方法对你来说毫无意义,那就问我吧!

只要替换它就行了

data_point.clear()


当您这样做时:

a = [1,2,3]
b = a
对b的赋值复制了对列表的引用,而不是实际列表

因此,如果后面更改a,例如
a[0]=100
,b也将变成[100,2,3]

执行
数据\u point=[]
时,您需要创建一个包含新值的新列表

因此,第一次,数据点列表如下: [数据点名称下的第一个列表]

第二次: [第一个列表在数据点的名称下,第二个列表在数据点的名称下]

等等

另一方面,如果执行
数据点.clear()
,则不会创建新列表,因此,第一次:

[数据点名称下的第一个列表]

第二次:

[首先列出\u下的\u数据\u点\u的\u名称\u,但\u具有\u更新的\u值,
第一个\u列表\u在\u数据\u点\u的\u名称\u下,但\u具有\u更新的\u值]

我建议通过向代码中添加大量打印调用来检查列表生成的正确性。最好减少计数器,例如,使用4而不是1000,使用20而不是10000,然后还可以打印中间列表和其他中间结果,以查看是否一切都真的“运行良好”。当您完成此操作后,您还可以更清楚地解释您想要实现的目标以及失败的地方。我做到了。在我尝试附加列表之前,所有操作都有效,包括清除以前的数据点列表和打印新的当前数据点列表。这很有效!非常感谢!也感谢您的解释,I just假设每次清除列表与“创建新列表”相同,但您的解释很有道理。
data_point = []
a = [1,2,3]
b = a