from copy import deepcopy
class old_class:
def __init__(self):
self.blah = 'blah'
class new_class(object):
def __init__(self):
self.blah = 'blah'
dignore = {str: None, unicode: None, int: None, type(None): None}
def Copy(obj, use_deepcopy=True):
t = type(obj)
if t in (list, tuple):
if t == tuple:
# Convert to a list if a tuple to
# allow assigning to when copying
is_tuple = True
obj = list(obj)
else:
# Otherwise just do a quick slice copy
obj = obj[:]
is_tuple = False
# Copy each item recursively
for x in xrange(len(obj)):
if type(obj[x]) in dignore:
continue
obj[x] = Copy(obj[x], use_deepcopy)
if is_tuple:
# Convert back into a tuple again
obj = tuple(obj)
elif t == dict:
# Use the fast shallow dict copy() method and copy any
# values which aren't immutable (like lists, dicts etc)
obj = obj.copy()
for k in obj:
if type(obj[k]) in dignore:
continue
obj[k] = Copy(obj[k], use_deepcopy)
elif t in dignore:
# Numeric or string/unicode?
# It's immutable, so ignore it!
pass
elif use_deepcopy:
obj = deepcopy(obj)
return obj
if __name__ == '__main__':
import copy
from time import time
num_times = 100000
L = [None, 'blah', 1, 543.4532,
['foo'], ('bar',), {'blah': 'blah'},
old_class(), new_class()]
t = time()
for i in xrange(num_times):
Copy(L)
print 'Custom Copy:', time()-t
t = time()
for i in xrange(num_times):
Copy(L, use_deepcopy=False)
print 'Custom Copy Only Copying Lists/Tuples/Dicts (no classes):', time()-t
t = time()
for i in xrange(num_times):
copy.copy(L)
print 'copy.copy:', time()-t
t = time()
for i in xrange(num_times):
copy.deepcopy(L)
print 'copy.deepcopy:', time()-t
t = time()
for i in xrange(num_times):
L[:]
print 'list slicing [:]:', time()-t
t = time()
for i in xrange(num_times):
list(L)
print 'list(L):', time()-t
t = time()
for i in xrange(num_times):
[i for i in L]
print 'list expression(L):', time()-t
t = time()
for i in xrange(num_times):
a = []
a.extend(L)
print 'list extend:', time()-t
t = time()
for i in xrange(num_times):
a = []
for y in L:
a.append(y)
print 'list append:', time()-t
t = time()
for i in xrange(num_times):
a = []
a.extend(i for i in L)
print 'generator expression extend:', time()-t
费利克斯已经给出了一个很好的答案,但我想我应该对各种方法做一个速度比较:
Copy()
方法使用deepcopy复制类Copy()
方法,不复制类(仅dict/list/tuple)for item in old_list: new_list.append(item)
[i for i in old_list]
(alist comprehension)list(old_list)
new_list = []; new_list.extend(old_list)
old_list[:]
(list slicing)所以最快的是列表切片。但是请注意
copy.copy()
、list[:]
和list(list)
与copy.deepcopy()
不同,python版本不会复制列表中的任何列表、字典和类实例,因此如果原始实例发生更改,它们也会在复制的列表中更改,反之亦然。(如果有人感兴趣或想提出任何问题,请看下面的脚本:)
我有been told那个Python 3.3+adds ^{} 方法,应该和切片一样快:
newlist = old_list.copy()
使用
new_list = my_list
,实际上没有两个列表。赋值只是将引用复制到列表,而不是实际的列表,因此new_list
和my_list
在赋值之后都引用同一个列表。要实际复制列表,您有多种可能性:
您可以使用内置的^{} 方法(从Python 3.3开始提供):
你可以切开它:
Alex Martelli's关于这个的观点(至少是back in 2007)是,这是一个奇怪的语法,使用它是没有意义的。(在他看来,下一个更具可读性)。
您可以使用内置的^{} 函数:
您可以使用泛型^{} :
这比
list()
慢一点,因为它必须首先找出old_list
的数据类型。如果列表包含对象,并且您也想复制它们,请使用泛型^{} :
显然是最慢最需要记忆的方法,但有时不可避免。
示例:
结果:
相关问题 更多 >
编程相关推荐