Вам нужно профилировать свой код, чтобы узнать, где время тратится.
Это не обязательно означает использование профилировщика Python
Например, вы можете просто попробовать проанализировать тот же CSVСтрока 1000000 раз разными методами.Выберите самый быстрый метод - разделите на 1000000, теперь вы знаете, сколько процессорного времени требуется для разбора строки
Попробуйте разбить программу на части и выяснить, какие ресурсы действительно требуются для каждой части.
Части, которые требуют наибольшего количества ресурсов процессора на строку ввода, - это «горлышки бутылки»
На моем компьютере, программа ниже выдает это
ChanVal0 took 0.210402965546 seconds
ChanVal1 took 0.350302934647 seconds
ChanVal2 took 0.558166980743 seconds
ChanVal3 took 0.691503047943 seconds
Итак, вы видите, что примерно половина временизанято parseFromCsv
.Но также и то, что на извлечение значений и их сохранение в классе уходит довольно много времени.
Если класс не используется сразу, может быть быстрее сохранить необработанные данные и использовать свойства для анализаcsvString по запросу.
from time import time
import re
class ChanVal0(object):
def __init__(self, csvString=None,**kwargs):
self.csvString=csvString
for key in kwargs:
setattr(self,key,kwargs[key])
class ChanVal1(object):
def __init__(self, csvString=None,**kwargs):
if csvString is not None:
self.parseFromCsv(csvString)
for key in kwargs:
setattr(self,key,kwargs[key])
def parseFromCsv(self, csvString):
self.lst = csvString.split(',')
class ChanVal2(object):
def __init__(self, csvString=None,**kwargs):
if csvString is not None:
self.parseFromCsv(csvString)
for key in kwargs:
setattr(self,key,kwargs[key])
def parseFromCsv(self, csvString):
lst = csvString.split(',')
self.eventTime=lst[1]
self.eventTimeExact=long(lst[2])
self.other_clock=lst[3]
class ChanVal3(object):
splitter=re.compile("[^,]*,(?P<eventTime>[^,]*),(?P<eventTimeExact>[^,]*),(?P<other_clock>[^,]*)")
def __init__(self, csvString=None,**kwargs):
if csvString is not None:
self.parseFromCsv(csvString)
self.__dict__.update(kwargs)
def parseFromCsv(self, csvString):
self.__dict__.update(self.splitter.match(csvString).groupdict())
s="chan,2007-07-13T23:24:40.143,0,0188878425-079,0,0,True,S-4001,UNSIGNED_INT,name1,module1"
RUNS=100000
for cls in ChanVal0, ChanVal1, ChanVal2, ChanVal3:
start_time = time()
for i in xrange(RUNS):
cls(s)
print "%s took %s seconds"%(cls.__name__, time()-start_time)