Performance 修改这个python代码以使用pandas容易吗?如果这样做会有帮助吗?
我编写了一个Python2.7脚本,它读取一个CSV文件,然后进行一些标准偏差计算。它的工作绝对好,但它是非常非常缓慢。我用1亿条线尝试的CSV大约需要28小时才能完成。我在谷歌上搜索了一下,似乎使用pandas模块可能会使搜索速度更快 我已经发布了下面的部分代码,因为我是python的新手,我不确定使用pandas是否真的有帮助,如果有帮助,函数是否需要完全重新编写 只是CSV文件的一些上下文,它有3列,第一列是IP地址,第二列是url,第三列是时间戳Performance 修改这个python代码以使用pandas容易吗?如果这样做会有帮助吗?,performance,python-2.7,csv,pandas,Performance,Python 2.7,Csv,Pandas,我编写了一个Python2.7脚本,它读取一个CSV文件,然后进行一些标准偏差计算。它的工作绝对好,但它是非常非常缓慢。我用1亿条线尝试的CSV大约需要28小时才能完成。我在谷歌上搜索了一下,似乎使用pandas模块可能会使搜索速度更快 我已经发布了下面的部分代码,因为我是python的新手,我不确定使用pandas是否真的有帮助,如果有帮助,函数是否需要完全重新编写 只是CSV文件的一些上下文,它有3列,第一列是IP地址,第二列是url,第三列是时间戳 def parseCsvToDict(f
def parseCsvToDict(filepath):
with open(csv_file_path) as f:
ip_dict = dict()
csv_data = csv.reader(f)
f.next() # skip header line
for row in csv_data:
if len(row) == 3: #Some lines in the csv have more/less than the 3 fields they should have so this is a cheat to get the script working ignoring an wrong data
current_ip, URI, current_timestamp = row
epoch_time = convert_time(current_timestamp) # convert each time to epoch
if current_ip not in ip_dict.keys():
ip_dict[current_ip] = dict()
if URI not in ip_dict[current_ip].keys():
ip_dict[current_ip][URI] = list()
ip_dict[current_ip][URI].append(epoch_time)
return(ip_dict)
上述函数完成后,数据将解析为另一个函数,该函数计算每个IP/URL对的标准偏差(使用numpy.std
)
您认为使用pandas会提高速度吗?需要完全重写吗?或者修改上述代码容易吗?我无法给出确切的解决方案,但这里有一些想法 根据您的数据,您可以读取
100000000./28/60/60
大约每秒1000行。不是很慢,但我相信仅仅是读取这么大的文件就可能导致问题
现在我们来看一看如何读取一个大文件。基本上,一个人建议这样做:
file = open("sample.txt")
while 1:
lines = file.readlines(100000)
if not lines:
break
for line in lines:
pass # do something
可以给你3倍的阅读提升。我还建议您尝试在dict中创建[]
否则追加,而不是使用
最后,与python无关:在数据分析方面,我发现了一个处理csv/json的神奇工具。是的,它允许轻松地操作csv数据。我无法给您一个精确的解决方案,但这里有几个想法
根据您的数据,您可以读取100000000./28/60/60
大约每秒1000行。不是很慢,但我相信仅仅是读取这么大的文件就可能导致问题
现在我们来看一看如何读取一个大文件。基本上,一个人建议这样做:
file = open("sample.txt")
while 1:
lines = file.readlines(100000)
if not lines:
break
for line in lines:
pass # do something
可以给你3倍的阅读提升。我还建议您尝试在dict中创建[]
否则追加,而不是使用
最后,与python无关:在数据分析方面,我发现了一个处理csv/json的神奇工具。是的,它允许轻松地操作csv数据。我无法给您一个精确的解决方案,但这里有几个想法
根据您的数据,您可以读取100000000./28/60/60
大约每秒1000行。不是很慢,但我相信仅仅是读取这么大的文件就可能导致问题
现在我们来看一看如何读取一个大文件。基本上,一个人建议这样做:
file = open("sample.txt")
while 1:
lines = file.readlines(100000)
if not lines:
break
for line in lines:
pass # do something
可以给你3倍的阅读提升。我还建议您尝试在dict中创建[]
否则追加,而不是使用
最后,与python无关:在数据分析方面,我发现了一个处理csv/json的神奇工具。是的,它允许轻松地操作csv数据。我无法给您一个精确的解决方案,但这里有几个想法
根据您的数据,您可以读取100000000./28/60/60
大约每秒1000行。不是很慢,但我相信仅仅是读取这么大的文件就可能导致问题
现在我们来看一看如何读取一个大文件。基本上,一个人建议这样做:
file = open("sample.txt")
while 1:
lines = file.readlines(100000)
if not lines:
break
for line in lines:
pass # do something
可以给你3倍的阅读提升。我还建议您尝试在dict中创建[]
否则追加,而不是使用
最后,与python无关:在数据分析方面,我发现了一个处理csv/json的神奇工具。是的,它允许轻松地操作csv数据。除此之外:如果您希望保留尽可能多的脚本当前代码,您可能会发现:
“如果你想让你的代码运行得更快,你应该使用PyPy。”-Guido van Rossum(Python的创建者)
除此之外:如果希望保留尽可能多的脚本当前代码,您可能会发现:
“如果你想让你的代码运行得更快,你应该使用PyPy。”-Guido van Rossum(Python的创建者)
除此之外:如果希望保留尽可能多的脚本当前代码,您可能会发现:
“如果你想让你的代码运行得更快,你应该使用PyPy。”-Guido van Rossum(Python的创建者)
除此之外:如果希望保留尽可能多的脚本当前代码,您可能会发现:
“如果你想让你的代码运行得更快,你应该使用PyPy。”-Guido van Rossum(Python的创建者)
以下方面应起作用:
import pandas as pd
colnames = ["current_IP", "URI", "current_timestamp", "dummy"]
df = pd.read_csv(filepath, names=colnames)
# Remove incomplete and redundant rows:
df = df[~df.current_timestamp.isnull() & df.dummy.isnull()]
注意,这假设您有足够的RAM。在您的代码中,您已经假设您有足够的内存用于字典,但是后者可能比上面使用的内存小很多,原因有两个
如果是因为大多数行被删除,那么只需按块解析csv:参数skiprows
和nrows
是您的朋友,然后pd.concat
如果是因为IP/URL重复,那么您将希望将IP和URL从普通列转换为索引:如上所述按块进行解析,并在每个块上进行解析
indexed = df.set_index(["current_IP", "URI"]).sort_index()
我希望这确实会提高您的性能
编辑:。。。包括对标准偏差计算的性能提升(提示:df.groupby()
)以下操作应该有效:
import pandas as pd
colnames = ["current_IP", "URI", "current_timestamp", "dummy"]
df = pd.read_csv(filepath, names=colnames)
# Remove incomplete and redundant rows:
df = df[~df.current_timestamp.isnull() & df.dummy.isnull()]
注意,这假设您有足够的RAM。在代码中,您已经假设有足够的内存