【发布时间】:2015-04-28 13:35:42
【问题描述】:
代码如下:
import csv
import re
with open('alcohol_rehab_ltp.csv', 'rb') as csv_f, \
open('cities2.txt', 'rb') as cities, \
open('drug_rehab_city_state.csv', 'wb') as out_csv:
writer = csv.writer(out_csv, delimiter = ",")
reader = csv.reader(csv_f)
city_lst = cities.readlines()
for row in reader:
for city in city_lst:
city = city.strip()
match = re.search((r'\b{0}\b').format(city), row[0])
if match:
writer.writerow(row)
break
“alcohol_rehab_ltp.csv”有 145 行,“cities2.txt”有 18,895 行(转换为列表后变为 18,895)。这个过程需要一段时间才能运行,我没有计时但可能大约 5 分钟。我在这里忽略了一些简单(或更复杂)的东西,可以使这个脚本运行得更快。我将使用其他 .csv 文件来针对“cities.txt”的大文本文件运行,这些 csv 文件可能最多有 1000 行。任何关于如何加快速度的想法将不胜感激! 这是 csv 文件:关键字(144),平均。每次点击费用、本地搜索、广告商竞争
[alcohol rehab san diego],$49.54,90,High
[alcohol rehab dallas],$86.48,110,High
[alcohol rehab atlanta],$60.93,50,High
[free alcohol rehab centers],$11.88,110,High
[christian alcohol rehab centers],–,70,High
[alcohol rehab las vegas],$33.40,70,High
[alcohol rehab cost],$57.37,110,High
文本文件中的一些行:
san diego
dallas
atlanta
dallas
los angeles
denver
【问题讨论】:
-
嵌套循环的大小相对较小(18895 x 145 迭代)。您是否以任何方式对代码进行计时?您确定让您等待 5 分钟的瓶颈确实是循环吗?如果是这样,我会尝试摆脱正则表达式,转而使用由非字母字符分割的字符串并执行
if city in row.split(r'\W'):(将分割从“城市”循环中提升出来) -
我实际测量的时候是2分30秒。我以前没有使用过 datetime,所以我很高兴 Shawn Zhang 将它添加到他的代码中,这样我就可以了解如何使用它了。
-
你为什么用re?
-
你能否展示一些你的意见,因为我认为你做的工作比你需要的要多得多
-
我使用 re 是因为城市名称将包含在 csv 每一行的第一列中。例如,第 2 行第 1 列包含“san diego Alcohol rehab center”,“san diego”将是文本文件中的行之一。就我所知,我还没有想出更好的选择。
标签: python list python-2.7 csv for-loop