我研究这个问题已经很久了。我正在编写代码,使用已知的算法来增加ArrayList的大小,因为我正在向它添加内容。每次ArrayList的大小发生变化时,我都会将新的大小添加到一个数组中,然后将该数组添加到字典中。
下面是我正在使用的ArrayList类的代码
class ArrayList:
def __init__(self, growfn):
'''Initializes the empty ArrayList with the specified growth function.'''
self.size = 0
self.used = 0
self.array = []
self.grow = growfn
def get(self, index):
if index < self.size:
return self.array[index]
# exception handling
return None
def add(self, value):
if self.used == self.size:
newSize = self.grow(self.size)
if newSize <= self.size:
# exception handling
return
newArray = self.array[:]+[None for i in range(self.size,newSize)]
self.array = newArray
self.size = newSize
self.array[self.used] = value
self.used = self.used + 1
return None
下面是我编写的测试代码,这个函数有3个参数:一个列表,包含数组的最大大小、用于增加ArrayList大小的算法的函数以及它将运行的尝试次数。
def analyzePerformance(nList, gfn, tries):
data = []
sizes_array = []
averages = []
arr = ArrayList(gfn)
for num in nList:
for j in range(tries):
current_size = 0
start = time()
while arr.size < num:
arr.add(None)
if arr.size != current_size:
sizes_array.append(arr.size)
current_size = arr.size
end = time()
averages.append(end - start)
data.append(dict({'grow': gfn, 'N': num, 'seconds': mean(averages), 'sizes': sizes_array}))
return data
最后是调用函数的代码
def main():
for result in analyzePerformance([1,10,100], double, 11):
print(result)
double是一个简单地将数组的大小加倍的函数
以下是我当前的输出:
{'grow': <function double at 0x7f3274eb4f28>, 'N': 1, 'seconds': 3.034418279474432e-07, 'sizes': [1, 2, 4, 8, 16, 32, 64, 128]}
{'grow': <function double at 0x7f3274eb4f28>, 'N': 10, 'seconds': 4.659999500621449e-07, 'sizes': [1, 2, 4, 8, 16, 32, 64, 128]}
{'grow': <function double at 0x7f3274eb4f28>, 'N': 100, 'seconds': 7.369301535866477e-07, 'sizes': [1, 2, 4, 8, 16, 32, 64, 128]}
下面是我需要的输出
{'grow': <function double at 0x7f3274eb4f28>, 'N': 1, 'seconds': 3.034418279474432e-07, 'sizes': [1]}
{'grow': <function double at 0x7f3274eb4f28>, 'N': 10, 'seconds': 4.659999500621449e-07, 'sizes': [1, 2, 4, 8, 16]}
{'grow': <function double at 0x7f3274eb4f28>, 'N': 100, 'seconds': 7.369301535866477e-07, 'sizes': [1, 2, 4, 8, 16, 32, 64, 128]}
为什么当我用不同长度的sizes数组向字典中添加新元素时,它会更新旧的字典,使其也具有更长的数组?任何帮助都是感激的,谢谢!
1条答案
按热度按时间lf5gs5x21#
您可能需要查看Shallow and deep copy operations:
Python中的赋值语句并不复制对象,而是在目标和对象之间创建绑定。对于可变的或包含可变项的集合,有时需要一个副本,这样就可以更改一个副本而不更改另一个副本。
对于下一段代码,
sizes_array
将在不同的迭代中重用,尽管它已经被添加到data list
中:要解决此问题,您需要将above更改为next:
使用上面的命令,您将看到符合您要求的
sizes_array
的复制对象。