快速课堂宣言

时间:2014-08-08 04:19:46

标签: python

有一个包含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

1 个答案:

答案 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