这是Alexandru解决方案的改进版(未经测试…)(注意:Alexandru发布自己的答案时,我已经在写了这个答案,但既然他先发布了,如果它有助于解决您的问题,请给他信用)。
一般的想法是只对文件执行一次单次扫描,而不是连续执行170038(=>1441*118)次顺序扫描,并减少
sheet.write()
调用找到的行数,而不是一遍又一遍地重写同一单元格。
此外,使用函数将有助于更快的执行,因为局部变量访问比全局变量访问更快。
不知道这是否能很快解决你的问题,但至少应该
许多的
比您当前的实现速度快。
注:6米
{(int,int):int}
dict很容易放在大多数现代计算机的内存中(只是在我的内存中试过,我的内存已经很忙了),所以这不是问题(而且你已经在内存中读取了整个文件,这可能是更重的wrt/内存…)
from collections import defaultdict
def parse_file():
counts = defaultdict(int)
with open("Data.txt") as f:
for lineno, line in enumerate(f):
line = line.strip()
if not line:
continue
try:
xy = tuple(int(i) for i in line.split(","))
except (TypeError, ValueError) as e:
print("oops, line {} is broken ? (found '{}')".format(lineno, line))
continue
counts[xy] += 1
return counts
def write_counts(counts):
book = xlsxwriter.Workbook("MyCount.xlsx")
sheet1 = book.add_worksheet('Sheet 1')
sheet1.write(0,0,'y\x')
for i in range (0,1441):
sheet1.write(0,i+1,i)
for i in range (1,118):
sheet1.write(i,0,i)
for (x, y), count in counts.items():
sheet1.write(y, x+1, count)
def main():
counts = parse_file()
write_counts(counts)
if __name__ == "__main__":
main()