有一个包含5个参数的列表。对于每个arg,我想声明MyClass
实例:
class MyClass(object):
def __init__(self, arg):
super(MyClass, self).__init__()
self.arg = arg
args=[1,2,3,4,5]
instanceList=[]
for arg in args:
inst=MyClass(arg)
instanceList.append(inst)
对于像这样的简单参数列表,速度不是一个因素。但在现实世界中,参数列表可能非常庞大。 我想知道代码是否可以设计为整个列表作为参数提交。然后返回一个声明的类实例列表(每个arg的一个类实例),获得速度和效率。
以下是使用建议方法的测试:
import time
number=1000000
def method1():
start=time.time()
instanceList=[]
for i in range(number):
instanceList.append(MyClass(i))
end=time.time()
elapsed=end-start
print 'method1: %s sec'%elapsed
def method2():
start=time.time()
instanceList=[MyClass(i) for i in range(number)]
end=time.time()
elapsed=end-start
print 'method2: %s sec'%elapsed
def method3():
start=time.time()
instanceList = map(MyClass, range(number))
end=time.time()
elapsed=end-start
print 'method3: %s sec'%elapsed
result=method1()
result=method2()
result=method3()
==========
method1: 3.19368100166 sec
method2: 2.68189811707 sec
method3: 2.68188095093 sec
答案 0 :(得分:6)
instanceList = [MyClass(arg) for arg in args]
或者甚至可能:
instanceList = map(MyClass, args)
是的,其中一些比其他更快,但不够重要:
import timeit
setup='''
class MyClass(object):
def __init__(self, arg):
super(MyClass, self).__init__()
self.arg = arg
args=[1,2,3,4,5]
'''
action1='''
instanceList=[]
for arg in args:
inst=MyClass(arg)
instanceList.append(inst)
'''
action2='''instanceList=[MyClass(arg) for arg in args]'''
action3='''map(instanceList=MyClass, args)'''
print timeit.timeit(action1, setup, number=int(1e6)) / 1e6
print timeit.timeit(action2, setup, number=int(1e6)) / 1e6
print timeit.timeit(action3, setup, number=int(1e6)) / 1e6
结果:
3.40896606445e-06
3.00701594353e-06
2.68505501747e-06