Python 莫丁比熊猫花更多的时间阅读CSV

Python 莫丁比熊猫花更多的时间阅读CSV,python,pandas,parallel-processing,jupyter-notebook,modin,Python,Pandas,Parallel Processing,Jupyter Notebook,Modin,我用它来扩展大数据集。但是,当使用pd.read_csv在jupyter笔记本中加载5 MB csv数据集以比较modin.pandas和pandas的性能时,它会给出意外的执行时间 莫丁:熊猫比熊猫要花更多的时间。为什么? 代码- 是指向CSV文件的链接。我使用的是modin版本0.8.3和pandas版本1.1.5 输出屏幕截图- 系统信息- 编辑:我尝试使用一个500 MB的CSV文件,结果只是略有改善。莫丁和熊猫现在的执行时间几乎相同。这是否正常?似乎Modin在第一次运行时进行了一些初

我用它来扩展大数据集。但是,当使用pd.read_csv在jupyter笔记本中加载5 MB csv数据集以比较modin.pandas和pandas的性能时,它会给出意外的执行时间

莫丁:熊猫比熊猫要花更多的时间。为什么?

代码-

是指向CSV文件的链接。我使用的是modin版本0.8.3和pandas版本1.1.5

输出屏幕截图-

系统信息-


编辑:我尝试使用一个500 MB的CSV文件,结果只是略有改善。莫丁和熊猫现在的执行时间几乎相同。这是否正常?

似乎Modin在第一次运行时进行了一些初始化,这可以解释为什么对于5MB CSV文件,您的Modin时间比Pandas时间慢

我调查了使用Pandas和Modin在四核系统上加载各种大小的CSV文件需要多长时间。以下是从5MB到100MB的CSV文件的结果图表:

对于高达2GB的文件:

结果表明,在测试的系统上:

对于所有文件大小,Modin读取CSV文件的速度都比Pandas快,但测试的最小文件为5MB 文件大小越大,性能差异越大 莫丁处理5MB文件的时间过长:0.23s,10MB文件为0.12s,15MB文件为0.16s 这是用于生成结果的代码

from pathlib import Path
from timeit import timeit

import modin.pandas as mpd
import pandas as pd

def create_input_file(filename, content, repetitions):
    path = Path(filename)
    if not path.exists():
        with path.open("a", encoding="utf-8") as f:
            for _ in range(repetitions):
                f.write(content)

def create_input_files(min_size, max_size, increment):
    content = Path("survey.csv").read_text(encoding="utf-8")
    for size in range(min_size, max_size + 1, increment):
        create_input_file(
            filename="survey{}MB.csv".format(size),
            content=content,
            repetitions=size // 5,
        )

def time_csv_read(module, filename, description):
    print(
        "{}: {:.2f} seconds".format(
            description,
            timeit(lambda: getattr(module, "read_csv")(filename), number=1)
        )
    )

def time_csv_reads(min_size, max_size, increment):
    for size in range(min_size, max_size + 1, increment):
        time_csv_read(pd, "survey{}MB.csv".format(size), "Pandas {}MB".format(size))
        time_csv_read(mpd, "survey{}MB.csv".format(size), "Modin {}MB".format(size))

def main():
    min_size1 = 5
    max_size1 = 95
    increment1 = 5
    min_size2 = 100
    max_size2 = 2000
    increment2 = 100
    create_input_files(min_size1, max_size1, increment1)
    create_input_files(min_size2, max_size2, increment2)
    time_csv_reads(min_size1, max_size1, increment1)
    time_csv_reads(min_size2, max_size2, increment2)

if __name__ == "__main__":
    main()
以下是已删除警告消息的原始输出:

Pandas 5MB: 0.12 seconds
Modin 5MB: 0.23 seconds
Pandas 10MB: 0.13 seconds
Modin 10MB: 0.12 seconds
Pandas 15MB: 0.19 seconds
Modin 15MB: 0.16 seconds
Pandas 20MB: 0.24 seconds
Modin 20MB: 0.20 seconds
Pandas 25MB: 0.31 seconds
Modin 25MB: 0.25 seconds
Pandas 30MB: 0.37 seconds
Modin 30MB: 0.29 seconds
Pandas 35MB: 0.40 seconds
Modin 35MB: 0.34 seconds
Pandas 40MB: 0.45 seconds
Modin 40MB: 0.37 seconds
Pandas 45MB: 0.51 seconds
Modin 45MB: 0.42 seconds
Pandas 50MB: 0.55 seconds
Modin 50MB: 0.46 seconds
Pandas 55MB: 0.62 seconds
Modin 55MB: 0.50 seconds
Pandas 60MB: 0.67 seconds
Modin 60MB: 0.53 seconds
Pandas 65MB: 0.74 seconds
Modin 65MB: 0.57 seconds
Pandas 70MB: 0.76 seconds
Modin 70MB: 0.61 seconds
Pandas 75MB: 0.87 seconds
Modin 75MB: 0.65 seconds
Pandas 80MB: 0.90 seconds
Modin 80MB: 0.67 seconds
Pandas 85MB: 0.93 seconds
Modin 85MB: 0.73 seconds
Pandas 90MB: 0.97 seconds
Modin 90MB: 0.74 seconds
Pandas 95MB: 1.34 seconds
Modin 95MB: 0.80 seconds
Pandas 100MB: 1.11 seconds
Modin 100MB: 0.83 seconds
Pandas 200MB: 2.21 seconds
Modin 200MB: 1.62 seconds
Pandas 300MB: 3.28 seconds
Modin 300MB: 2.40 seconds
Pandas 400MB: 5.48 seconds
Modin 400MB: 3.25 seconds
Pandas 500MB: 8.61 seconds
Modin 500MB: 3.92 seconds
Pandas 600MB: 8.11 seconds
Modin 600MB: 4.64 seconds
Pandas 700MB: 9.48 seconds
Modin 700MB: 5.70 seconds
Pandas 800MB: 11.40 seconds
Modin 800MB: 6.35 seconds
Pandas 900MB: 12.63 seconds
Modin 900MB: 7.17 seconds
Pandas 1000MB: 13.59 seconds
Modin 1000MB: 7.91 seconds
Pandas 1100MB: 14.84 seconds
Modin 1100MB: 8.63 seconds
Pandas 1200MB: 17.27 seconds
Modin 1200MB: 9.42 seconds
Pandas 1300MB: 17.77 seconds
Modin 1300MB: 10.22 seconds
Pandas 1400MB: 19.38 seconds
Modin 1400MB: 11.15 seconds
Pandas 1500MB: 21.77 seconds
Modin 1500MB: 11.98 seconds
Pandas 1600MB: 26.79 seconds
Modin 1600MB: 12.55 seconds
Pandas 1700MB: 23.55 seconds
Modin 1700MB: 13.66 seconds
Pandas 1800MB: 26.41 seconds
Modin 1800MB: 13.89 seconds
Pandas 1900MB: 28.44 seconds
Modin 1900MB: 15.15 seconds
Pandas 2000MB: 30.58 seconds
Modin 2000MB: 15.71 seconds
莫丁处理10MB文件的速度比处理5MB文件的速度快,这一事实向我表明,莫丁在第一次运行时做了一些初始化工作,因此我通过多次读取同一个5MB文件来测试这一理论。第一次用了0.28秒,随后的时间都用了0.08秒。如果在同一个Python进程中多次运行Modin,您应该会看到类似的性能差异


这项初始化工作与我在评论你的问题时所说的开销类型不同。我想到的代码是将工作分割成块,发送给每个处理器,然后在处理器完成每个块后将结果重新组合在一起。每次Modin读取CSV文件时都会出现这种开销;莫丁在第一次运行时所做的额外工作肯定是别的。因此,一旦莫丁完成了它的初始化,它将是值得使用的,即使是小到5MB的文件。对于小于该值的文件,我所说的开销可能会成为一个因素,但需要更多的调查才能知道文件需要多小才能发挥作用。

莫丁在第一次运行时似乎进行了一些初始化,这就解释了为什么对于5MB CSV文件,您的Modin时间比熊猫时间慢

我调查了使用Pandas和Modin在四核系统上加载各种大小的CSV文件需要多长时间。以下是从5MB到100MB的CSV文件的结果图表:

对于高达2GB的文件:

结果表明,在测试的系统上:

对于所有文件大小,Modin读取CSV文件的速度都比Pandas快,但测试的最小文件为5MB 文件大小越大,性能差异越大 莫丁处理5MB文件的时间过长:0.23s,10MB文件为0.12s,15MB文件为0.16s 这是用于生成结果的代码

from pathlib import Path
from timeit import timeit

import modin.pandas as mpd
import pandas as pd

def create_input_file(filename, content, repetitions):
    path = Path(filename)
    if not path.exists():
        with path.open("a", encoding="utf-8") as f:
            for _ in range(repetitions):
                f.write(content)

def create_input_files(min_size, max_size, increment):
    content = Path("survey.csv").read_text(encoding="utf-8")
    for size in range(min_size, max_size + 1, increment):
        create_input_file(
            filename="survey{}MB.csv".format(size),
            content=content,
            repetitions=size // 5,
        )

def time_csv_read(module, filename, description):
    print(
        "{}: {:.2f} seconds".format(
            description,
            timeit(lambda: getattr(module, "read_csv")(filename), number=1)
        )
    )

def time_csv_reads(min_size, max_size, increment):
    for size in range(min_size, max_size + 1, increment):
        time_csv_read(pd, "survey{}MB.csv".format(size), "Pandas {}MB".format(size))
        time_csv_read(mpd, "survey{}MB.csv".format(size), "Modin {}MB".format(size))

def main():
    min_size1 = 5
    max_size1 = 95
    increment1 = 5
    min_size2 = 100
    max_size2 = 2000
    increment2 = 100
    create_input_files(min_size1, max_size1, increment1)
    create_input_files(min_size2, max_size2, increment2)
    time_csv_reads(min_size1, max_size1, increment1)
    time_csv_reads(min_size2, max_size2, increment2)

if __name__ == "__main__":
    main()
以下是已删除警告消息的原始输出:

Pandas 5MB: 0.12 seconds
Modin 5MB: 0.23 seconds
Pandas 10MB: 0.13 seconds
Modin 10MB: 0.12 seconds
Pandas 15MB: 0.19 seconds
Modin 15MB: 0.16 seconds
Pandas 20MB: 0.24 seconds
Modin 20MB: 0.20 seconds
Pandas 25MB: 0.31 seconds
Modin 25MB: 0.25 seconds
Pandas 30MB: 0.37 seconds
Modin 30MB: 0.29 seconds
Pandas 35MB: 0.40 seconds
Modin 35MB: 0.34 seconds
Pandas 40MB: 0.45 seconds
Modin 40MB: 0.37 seconds
Pandas 45MB: 0.51 seconds
Modin 45MB: 0.42 seconds
Pandas 50MB: 0.55 seconds
Modin 50MB: 0.46 seconds
Pandas 55MB: 0.62 seconds
Modin 55MB: 0.50 seconds
Pandas 60MB: 0.67 seconds
Modin 60MB: 0.53 seconds
Pandas 65MB: 0.74 seconds
Modin 65MB: 0.57 seconds
Pandas 70MB: 0.76 seconds
Modin 70MB: 0.61 seconds
Pandas 75MB: 0.87 seconds
Modin 75MB: 0.65 seconds
Pandas 80MB: 0.90 seconds
Modin 80MB: 0.67 seconds
Pandas 85MB: 0.93 seconds
Modin 85MB: 0.73 seconds
Pandas 90MB: 0.97 seconds
Modin 90MB: 0.74 seconds
Pandas 95MB: 1.34 seconds
Modin 95MB: 0.80 seconds
Pandas 100MB: 1.11 seconds
Modin 100MB: 0.83 seconds
Pandas 200MB: 2.21 seconds
Modin 200MB: 1.62 seconds
Pandas 300MB: 3.28 seconds
Modin 300MB: 2.40 seconds
Pandas 400MB: 5.48 seconds
Modin 400MB: 3.25 seconds
Pandas 500MB: 8.61 seconds
Modin 500MB: 3.92 seconds
Pandas 600MB: 8.11 seconds
Modin 600MB: 4.64 seconds
Pandas 700MB: 9.48 seconds
Modin 700MB: 5.70 seconds
Pandas 800MB: 11.40 seconds
Modin 800MB: 6.35 seconds
Pandas 900MB: 12.63 seconds
Modin 900MB: 7.17 seconds
Pandas 1000MB: 13.59 seconds
Modin 1000MB: 7.91 seconds
Pandas 1100MB: 14.84 seconds
Modin 1100MB: 8.63 seconds
Pandas 1200MB: 17.27 seconds
Modin 1200MB: 9.42 seconds
Pandas 1300MB: 17.77 seconds
Modin 1300MB: 10.22 seconds
Pandas 1400MB: 19.38 seconds
Modin 1400MB: 11.15 seconds
Pandas 1500MB: 21.77 seconds
Modin 1500MB: 11.98 seconds
Pandas 1600MB: 26.79 seconds
Modin 1600MB: 12.55 seconds
Pandas 1700MB: 23.55 seconds
Modin 1700MB: 13.66 seconds
Pandas 1800MB: 26.41 seconds
Modin 1800MB: 13.89 seconds
Pandas 1900MB: 28.44 seconds
Modin 1900MB: 15.15 seconds
Pandas 2000MB: 30.58 seconds
Modin 2000MB: 15.71 seconds
莫丁处理10MB文件的速度比处理5MB文件的速度快,这一事实向我表明,莫丁在第一次运行时做了一些初始化工作,因此我通过多次读取同一个5MB文件来测试这一理论。第一次用了0.28秒,随后的时间都用了0.08秒。如果在同一个Python进程中多次运行Modin,您应该会看到类似的性能差异


这项初始化工作与我在评论你的问题时所说的开销类型不同。我想到的代码是将工作分割成块,发送给每个处理器,然后在处理器完成每个块后将结果重新组合在一起。每次Modin读取CSV文件时都会出现这种开销;莫丁在第一次运行时所做的额外工作肯定是别的。因此,一旦莫丁完成了它的初始化,它将是值得使用的,即使是小到5MB的文件。对于小于该值的文件,我刚才提到的开销可能会成为一个因素,但需要更多的调查才能知道文件需要多小才能发挥作用。

尝试更大的CSV文件。5MB可能不足以使通过并行化工作负载获得的速度提高大于设置并行化的开销。表示它甚至适用于1MB数据集。我希望熊猫和熊猫的死刑执行时间相同
用于较小数据集的modin。我做错什么了吗?工作和速度不是一回事。要使某些内容在多个处理器上运行,需要有代码将工作分割成块,发送给每个处理器,并在处理器处理完每个块后将结果重新组合在一起。这不是免费的。代码必须在某个地方运行,因此CPU时间必须在并行化开销和实际工作之间分配。在某种程度上,将有足够的工作来证明开销的合理性,但在此之前,单线程解决方案将更快;我只是认为5MB的数据可能不足以证明使用modin是合理的。但这只是一个猜测。为了证明这一点,请尝试使用500MB的CSV文件,而不是5MB的CSV文件。只要将现有数据连接100次就可以了。如果莫丁的速度比普通熊猫慢,那么你就知道你有问题了。请看我更新的问题。性能略有提高。请尝试使用更大的CSV文件。5MB可能不足以使通过并行化工作负载获得的速度提高大于设置并行化的开销。表示它甚至适用于1MB数据集。对于较小的数据集,pandas和modin的执行时间应该相同。我做错什么了吗?工作和速度不是一回事。要使某些内容在多个处理器上运行,需要有代码将工作分割成块,发送给每个处理器,并在处理器处理完每个块后将结果重新组合在一起。这不是免费的。代码必须在某个地方运行,因此CPU时间必须在并行化开销和实际工作之间分配。在某种程度上,将有足够的工作来证明开销的合理性,但在此之前,单线程解决方案将更快;我只是认为5MB的数据可能不足以证明使用modin是合理的。但这只是一个猜测。为了证明这一点,请尝试使用500MB的CSV文件,而不是5MB的CSV文件。只要将现有数据连接100次就可以了。如果莫丁的速度比普通熊猫慢,那么你就知道你有问题了。请看我更新的问题。性能只是略有提高。