迭代长字符串列表的优化

时间:2016-10-16 05:47:06

标签: python python-2.7

下面的代码片段大约在18秒内执行。 EdgeList估计长度为330K。有没有办法优化它,考虑到我多次调用它。

我已尝试优化插入我的MeanspeedDict。但我想它已经是最好的了?

    EdgeList = traci.edge.getIDList() #Returns a list of Strings
    for edge in EdgeList:
        meanspeed = traci.edge.getLastStepMeanSpeed(edge) #returns a float value
        '''
        if edge in MeanspeedDict:
            MeanspeedDict[edge].append(meanspeed)
            MeanspeedDict[edge] = MeanspeedDict[edge][-300:] #Only keep the last 300 values
        else:
            MeanspeedDict[edge] = [meanspeed]
        '''
        try:
            MeanspeedDict[edge].append(meanspeed)
            MeanspeedDict[edge] = MeanspeedDict[edge][-300:] #Only keep the last 300 values
        except KeyError:
            MeanspeedDict[edge] = [meanspeed]

根据要求提供资料数据。运行 11

         252229348 function calls in 295.056 seconds

   Ordered by: standard name

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.000    0.000  295.056  295.056 <string>:1(<module>)
        1    0.000    0.000   40.158   40.158 __init__.py:101(getVersion)
        1    0.000    0.000    4.908    4.908 __init__.py:105(close)
        1    0.000    0.000    0.000    0.000 __init__.py:111(switch)
        1    0.000    0.000    0.507    0.507 __init__.py:45(connect)
        1    0.000    0.000    0.000    0.000 __init__.py:49(normalize_encoding)
        1    0.000    0.000   40.665   40.665 __init__.py:64(init)
        1    0.000    0.000    0.008    0.008 __init__.py:71(search_function)
       11    0.000    0.000    1.646    0.150 __init__.py:92(simulationStep)
  3607912    2.785    0.000  221.939    0.000 _edge.py:151(getLastStepMeanSpeed)
        1    0.000    0.000    0.000    0.000 codecs.py:92(__new__)
  3607923    5.689    0.000   16.796    0.000 connection.py:119(_beginMessage)
  3607923    3.451    0.000  210.529    0.000 connection.py:128(_sendReadOneStringCmd)
  3607923    8.231    0.000  190.282    0.000 connection.py:152(_checkResult)
       11    0.000    0.000    1.646    0.150 connection.py:254(simulationStep)
        1    0.000    0.000   40.158   40.158 connection.py:273(getVersion)
        1    0.000    0.000    4.908    4.908 connection.py:285(close)
        1    0.000    0.000    0.507    0.507 connection.py:48(__init__)
  3607923    4.167    0.000    8.645    0.000 connection.py:64(_packString)
  3607936   19.808    0.000  108.622    0.000 connection.py:72(_recvExact)
  3607936   19.507    0.000  200.505    0.000 connection.py:91(_sendExact)
       15    0.000    0.000    0.000    0.000 copy.py:123(_copy_inst)
       15    0.000    0.000    0.000    0.000 copy.py:66(copy)
       15    0.000    0.000    0.000    0.000 domain.py:108(_setConnection)
  3607923    4.273    0.000  236.643    0.000 domain.py:111(_getUniversal)
       11    0.004    0.000   17.493    1.590 domain.py:116(getIDList)
       15    0.000    0.000    0.000    0.000 domain.py:37(__init__)
      495    0.000    0.000    0.000    0.000 domain.py:47(reset)
       15    0.000    0.000    0.000    0.000 domain.py:99(_register)
        1    0.000    0.000    0.000    0.000 latin_1.py:13(Codec)
        1    0.000    0.000    0.000    0.000 latin_1.py:20(IncrementalEncoder)
        1    0.000    0.000    0.000    0.000 latin_1.py:24(IncrementalDecoder)
        1    0.000    0.000    0.000    0.000 latin_1.py:28(StreamWriter)
        1    0.000    0.000    0.000    0.000 latin_1.py:31(StreamReader)
        1    0.000    0.000    0.000    0.000 latin_1.py:34(StreamConverter)
        1    0.000    0.000    0.000    0.000 latin_1.py:41(getregentry)
        1    0.000    0.000    0.000    0.000 latin_1.py:8(<module>)
        1    0.000    0.000    0.000    0.000 six.py:180(find_module)
        1    0.000    0.000    0.000    0.000 six.py:184(find_module)
        1    0.001    0.001    0.001    0.001 socket.py:189(__init__)
        1    0.000    0.000    0.000    0.000 socket.py:196(close)
        2    0.000    0.000    0.506    0.253 socket.py:227(meth)
  3607936    1.590    0.000    1.590    0.000 storage.py:32(__init__)
 39687197   29.658    0.000   39.432    0.000 storage.py:36(read)
       12    0.000    0.000    0.000    0.000 storage.py:41(readInt)
  3607912    1.564    0.000    5.345    0.000 storage.py:44(readDouble)
  3607924    1.712    0.000    5.389    0.000 storage.py:47(readLength)
 10823772   17.543    0.000   50.373    0.000 storage.py:53(readString)
       11    1.922    0.175   16.496    1.500 storage.py:57(readStringList)
        1    0.000    0.000    0.000    0.000 subprocess.py:458(_cleanup)
        1    0.000    0.000    0.000    0.000 subprocess.py:578(list2cmdline)
        1    0.000    0.000    0.045    0.045 subprocess.py:651(__init__)
        1    0.000    0.000    0.000    0.000 subprocess.py:811(_get_handles)
        3    0.000    0.000    0.000    0.000 subprocess.py:881(_make_inheritable)
        1    0.000    0.000    0.045    0.045 subprocess.py:905(_execute_child)
        3    0.000    0.000    0.000    0.000 subprocess.py:946(_close_in_parent)
        1    6.670    6.670  295.056  295.056 traciTest_meanspeed.py:45(runTraCI)
        1    0.007    0.007    0.007    0.007 {__import__}
 39687197    3.728    0.000    3.728    0.000 {_struct.calcsize}
 10823795    3.374    0.000    3.374    0.000 {_struct.pack}
 43295133    7.225    0.000    7.225    0.000 {_struct.unpack}
        1    0.045    0.045    0.045    0.045 {_subprocess.CreateProcess}
        3    0.000    0.000    0.000    0.000 {_subprocess.DuplicateHandle}
        6    0.000    0.000    0.000    0.000 {_subprocess.GetCurrentProcess}
        1    0.000    0.000    0.000    0.000 {_subprocess.GetStdHandle}
        4    0.000    0.000    0.000    0.000 {built-in method Close}
        1    0.000    0.000    0.000    0.000 {built-in method __new__ of type object at 0x1E22B4F8}
        8    0.000    0.000    0.000    0.000 {getattr}
       61    0.000    0.000    0.000    0.000 {hasattr}
        6    0.000    0.000    0.000    0.000 {isinstance}
 32471566    2.246    0.000    2.246    0.000 {len}
        3    0.000    0.000    0.000    0.000 {method 'add' of 'set' objects}
 10496061    2.479    0.000    2.479    0.000 {method 'append' of 'list' objects}
      990    0.000    0.000    0.000    0.000 {method 'clear' of 'dict' objects}
        1    0.506    0.506    0.506    0.506 {method 'connect' of '_socket.socket' objects}
 10823772   12.557    0.000   12.565    0.000 {method 'decode' of 'str' objects}
        1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler' objects}
  3607923    3.371    0.000    3.371    0.000 {method 'encode' of 'str' objects}
        2    0.000    0.000    0.000    0.000 {method 'fileno' of 'file' objects}
       17    0.000    0.000    0.000    0.000 {method 'get' of 'dict' objects}
        2    0.000    0.000    0.000    0.000 {method 'join' of 'str' objects}
  7215956   84.503    0.000   84.503    0.000 {method 'recv' of '_socket.socket' objects}
        3    0.000    0.000    0.000    0.000 {method 'remove' of 'set' objects}
  3607936   46.414    0.000   46.414    0.000 {method 'send' of '_socket.socket' objects}
        1    0.000    0.000    0.000    0.000 {method 'setsockopt' of '_socket.socket' objects}
        1    0.000    0.000    0.000    0.000 {method 'split' of 'str' objects}
        1    0.000    0.000    0.000    0.000 {method 'startswith' of 'str' objects}
        1    0.000    0.000    0.000    0.000 {method 'translate' of 'str' objects}
       15    0.000    0.000    0.000    0.000 {method 'update' of 'dict' objects}
       11    0.000    0.000    0.000    0.000 {method 'values' of 'dict' objects}
        2    0.000    0.000    0.000    0.000 {msvcrt.get_osfhandle}
       12    0.023    0.002    0.023    0.002 {range}
       27    0.000    0.000    0.000    0.000 {setattr}
        1    0.000    0.000    0.000    0.000 {sys.exit}
       22    0.000    0.000    0.000    0.000 {time.clock}

2 个答案:

答案 0 :(得分:1)

from collections import deque, defaultdict

MeanspeedDict = defaultdict(lambda: deque(maxlen=300))

EdgeList = traci.edge.getIDList()
for edge in EdgeList:
    MeanspeedDict[edge].append(traci.edge.getLastStepMeanSpeed(edge))

答案 1 :(得分:1)

似乎getLastStepMeanSpeed太慢了:

3607912    2.785    0.000  221.939    0.000 _edge.py:151(getLastStepMeanSpeed)

脚本花费75%的时间执行它(221/295)