我有一个excel,其中有2000行,每行包含1个数据,如
a.xls
RowNum Item
1 'A'
2 'B'
3 'C'
.
.
.
2000 'xyz'
我有另一个文件b.xls
,其中包含大约6300000行数据。在此文件中,a.xls
中出现了一些数据。我需要从与b.xls
中的项目对应的文件a.xls
中选择所有数据,并将其存储在名为A.csv
,B.csv
等的单独文件中
我是使用多线程完成的,但它需要花费大量时间来执行它。任何人都可以帮我减少延迟吗?
这是我用过的代码。以下函数在一个线程中开始,
def parseFromFile(pTickerList):
global gSearchList
lSearchList = gSearchList
for lTickerName in pTickerList:
c = csv.writer( open("op-new/"+ lTickerName + ".csv", "wb"))
c.writerow(["Ticker Name", "Time Stamp","Price", "Size"])
for line in lSearchList:
lSplittedLine = line.split(",")
lTickerNameFromSearchFile = lSplittedLine[0].strip()
if lTickerNameFromSearchFile[0] == "#":
continue
if ord(lTickerName[0]) < ord(lTickerNameFromSearchFile[0]):
break
elif ord(lTickerName[0]) > ord(lTickerNameFromSearchFile[0]):
continue
if lTickerNameFromSearchFile == lTickerName:
lTimeStamp = Decimal(float(lSplittedLine[1]))
lPrice = lSplittedLine[2]
lSize = lSplittedLine[4]
if str(lTimeStamp)[len(str(lTimeStamp))-2:] == "60":
lTimeStamp = str(lTimeStamp)[:len(str(lTimeStamp))-2] + "59.9"
if str(lTimeStamp).find(".") >= 0:
lTimeStamp = float(str(lTimeStamp).split(".")[0] + "." + str(lTimeStamp).split(".")[1][0])
lTimeStamp1 = "%.1f" %float(lTimeStamp)
lHumanReadableTimeStamp = datetime.strptime(str(lTimeStamp1), "%Y%m%d%H%M%S.%f")
else:
lHumanReadableTimeStamp = datetime.strptime(str(lTimeStamp), "%Y%m%d%H%M%S")
except Exception, e:
exc_type, exc_obj, exc_tb = sys.exc_info()
fname = os.path.split(exc_tb.tb_frame.f_code.co_filename)[1]
print(exc_type, fname, exc_tb.tb_lineno)
print line
print lTimeStamp
raw_input()
c.writerow([lTickerNameFromSearchFile, lHumanReadableTimeStamp,lPrice, lSize])
答案 0 :(得分:0)
很难查看代码并完全理解它,因为它引用的变量与您的解释不同,但我相信这种方法会对您有所帮助。
首先将所有a.csv
读入set
,其中包含您希望能够查找的特征。 Python中的sets
具有非常快的查找时间。这也会对你有所帮助,因为你在上面的代码内循环中做了很多重复计算。
然后开始阅读b.csv
,使用之前的a.csv set
进行检查。每当您找到匹配项时,请写信至A.csv
和B.csv
。
您可以对当前设置进行的大幅加速是删除内循环中的重复计算,并消除对线程的需求。因为a.csv
只有2000行,所以读起来会非常快。
如果您希望我扩展其中的任何部分,请告诉我。