我有一个体面的网页抓取脚本,它有一个25K + urls的输入到一个单独的页面抓取功能,它运行所有网址的for循环。在for循环结束时,它将结果写入csv。 目前,我已经有了这个代码:
if link == url[0]:
# Creating the file and writing headers with the first entry and closing after
# the first entry to go from write mode to append mode
with open(file_Name, 'w') as f:
stats_df.to_csv(f)
record_Counter = record_Counter + 1
print ('Two entries for one game recorded. Counter = ' + str(record_Counter))
elif link == url[1]:
# Opening the file in append mode and keeping it open for the majority of the loop
# and writing with no headers
f = open(file_Name, mode = 'a')
stats_df.to_csv(f, header=False)
record_Counter = record_Counter + 1
print ('Two entries for one game recorded. Counter = ' + str(record_Counter))
elif link == url[-1]:
# Writing the final entry of this page and closing the file
stats_df.to_csv(f, header=False)
record_Counter = record_Counter + 1
print ('Two entries for one game recorded. Counter = ' + str(record_Counter))
f.close()
else:
# Writing all entries in between
stats_df.to_csv(f, header=False)
record_Counter = record_Counter + 1
print ('Two entries for one game recorded. Counter = ' + str(record_Counter))
以前,我有这个:
if link == url[0]:
with open(file_Name, 'w') as f:
stats_df.to_csv(f)
record_Counter = record_Counter + 1
print ('Two entries for one game recorded. Counter = ' + str(record_Counter))
else:
with open(file_Name, 'a') as f:
stats_df.to_csv(f)
record_Counter = record_Counter + 1
print ('Two entries for one game recorded. Counter = ' + str(record_Counter))
我对更简单的代码的关注是我打开和关闭csv文件25K次,这减慢了我的运行时间。我目前担心的问题是,如果将f保持打开,则会出现内存损坏问题。
我对自己的任何一个问题都有理由吗?谢谢你的时间。
答案 0 :(得分:1)
真正的问题是程序员花了太多时间在错误的地方和错误的时间担心效率;过早优化是编程中所有邪恶(或至少大部分)的根源.-- Donald Knuth
我开始学习在1982年或83年的时间共享迷你电脑上进行编程。东西缓慢。记忆很紧张。因此,我过分担心内存/操作/等等。我的代码使用。放手这很难。
你说:
我对更简单的代码的关注是我打开和关闭csv文件25K次,这减慢了我的运行时间。
当然是。但显而易见?应用程序的时间敏感程度如何?如果运行需要额外的60秒,会产生什么影响?
另一方面:
我目前担心的问题是,如果让f打开,内存就会出现问题。
这是什么意思?
如果遇到异常并且程序关闭,Python将自行清理。如果你担心有人做了一些恶意的事情,它可能不会在出路时擦掉每一点内存,但是异常处理的全部意义在于以安全和一致的方式处理异常。
我可能对此非常不对,但我读这段代码的方式是:
elif link == url[1]:
# Opening the file in append mode and keeping it open for the majority of the loop
# and writing with no headers
f = open(file_Name, mode = 'a')
stats_df.to_csv(f, header=False)
record_Counter = record_Counter + 1
print ('Two entries for one game recorded. Counter = ' + str(record_Counter))
您每次通过循环尝试打开file_name并调用文件句柄f。我不知道VM内部发生了什么,但是(a)你每次关闭并重新打开文件,或者(ii)你发现文件已经打开并且只是重用f。我不知道这比仅仅打开文件追加和爆破数据更有效。
IMO我不认为速度的差异在这个规模上是值得的。
另一方面,Knuth也说:
程序员浪费了大量时间来考虑或担心程序中非关键部分的速度,而这些效率尝试实际上在考虑调试和维护时会产生很大的负面影响。我们应该忘记小的效率,大约97%的时间说:过早的优化是所有邪恶的根源。然而,我们不应该把这个关键的3%的机会放弃。