Performance 修改这个python代码以使用pandas容易吗?如果这样做会有帮助吗?

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

我编写了一个Python2.7脚本,它读取一个CSV文件,然后进行一些标准偏差计算。它的工作绝对好,但它是非常非常缓慢。我用1亿条线尝试的CSV大约需要28小时才能完成。我在谷歌上搜索了一下,似乎使用pandas模块可能会使搜索速度更快

我已经发布了下面的部分代码,因为我是python的新手,我不确定使用pandas是否真的有帮助,如果有帮助,函数是否需要完全重新编写

只是CSV文件的一些上下文,它有3列,第一列是IP地址,第二列是url,第三列是时间戳

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。在代码中,您已经假设有足够的内存