【发布时间】:2016-02-25 20:53:19
【问题描述】:
我在 python 中使用 openpyxl,我试图运行 50k 行并从每一行获取数据并将其放入文件中。但是..我发现它运行得越慢,我越深入它。前 1k 行的速度非常快,不到一分钟,但之后,完成接下来的 1k 行需要的时间越来越长。
我正在打开一个 .xlsx 文件。我想知道将 .txt 文件作为 csv 或其他文件打开或读取 json 文件或其他文件是否更快?或者以某种方式转换为阅读速度更快的东西?
我在给定列中有 20 个唯一值,然后每个值的值都是随机的。我正在尝试为每个值获取整个唯一值列的字符串。
值 1:1243,345,34,124, 值2:1243,345,34,124, 等等等等
我正在遍历值列表,查看文件中是否存在该名称,如果存在,那么它将访问该文件并将新值附加到该文件中,如果该文件不存在,它将创建该文件,然后将其设置为追加。我有一个字典,它连接了所有“附加写入文件”的东西,所以每当我想写东西时,它会获取文件名,附加的东西将在字典中可用,它会查找并写入该文件,因此它不会在每次运行时都打开新文件。
前 1k 只用了不到一分钟.. 现在我正在处理 4k 到 5k 的记录,并且它已经准备好运行 5 分钟.. 随着记录的增加,它似乎需要更长的时间,我想知道如何加快速度向上。它根本没有打印到控制台。
writeFile = 1
theDict = {}
for row in ws.iter_rows(rowRange):
for cell in row:
#grabbing the value
theStringValueLocation = "B" + str(counter)
theValue = ws[theStringValueLocation].value
theName = cell.value
textfilename = theName + ".txt"
if os.path.isfile(textfilename):
listToAddTo = theDict[theName]
listToAddTo.write("," + theValue)
if counter == 1000:
print "1000"
st = datetime.datetime.fromtimestamp(ts).strftime('%Y-%m-%d %H:%M:%S')
else:
writeFileName = open(textfilename, 'w')
writeFileName.write(theValue)
writeFileName = open(textfilename, 'a')
theDict[theName] = writeFileName
counter = counter + 1
我在上面的代码中添加了一些时间戳,它不存在,但你可以看到下面的输出。我看到的问题是每跑 1k 次它就会越来越高。第一次是 2 分钟,然后是 3 分钟,然后是 5 分钟,然后是 7 分钟。当它达到 50k 时,我担心它会花费一个小时左右,而且会花费太长时间。
1000
2016-02-25 15:15:08
20002016-02-25 15:17:07
30002016-02-25 15:20:52
2016-02-25 15:25:28
4000
2016-02-25 15:32:00
5000
2016-02-25 15:40:02
6000
2016-02-25 15:51:34
7000
2016-02-25 16:03:29
8000
2016-02-25 16:18:52
9000
2016-02-25 16:35:30
10000
有些事情我应该说清楚.. 我不知道值的名称提前,也许我应该运行并在单独的 python 脚本中获取它们以加快速度?
其次,我需要一个由逗号分隔的所有值的字符串,这就是为什么我把它放到一个文本文件中以便以后抓取。我正在考虑按照向我建议的列表来做,但我想知道这是否会有同样的问题。我认为这个问题与阅读excel有关。无论如何,我可以从中得到一个用逗号分隔的字符串,我可以用另一种方式来做。
或者也许我可以尝试/捕获而不是每次都搜索文件,如果出现错误,我可以假设创建一个新文件?也许每次查找都让它变得很慢?如果文件存在?
这个问题是我原来在这里的延续,我从那里得到了一些建议....What is the fastest performance tuple for large data sets in python?
【问题讨论】:
-
您的代码缩进是错误的,这意味着我们无法判断您的循环的结构。你为什么要遍历单元格,然后无论如何访问某行 B 列中的单元格?我猜
ws["B" + str(counter)].value以线性时间运行。counter,不是固定时间。 -
no 缩进没有错。你明白了..我正在获取两个值。 B 是“价值”所在的地方。 “cell.value”是名称。我正在使用计数器来抓取彼此在同一行的那个。
-
哦,是的,你是对的.. 行中的单元格后面应该有一个缩进.. 我会修复它
-
不知道你想做什么。提供输入电子表格的几行/列以及一两个输出文件的外观可能会有所帮助。另外,你打开了多少文件?
-
性能应该是线性的。如果不是这种情况,那么您可能在某处有一个嵌套循环。
标签: python excel performance openpyxl