Modin 读取 CSV 所花费的时间超过 pandas
Modin is taking more time than pandas for reading CSV
我正在使用 modin.pandas to scale pandas 处理大型数据集。但是,当使用 pd.read_csv
在 jupyter notebook
中加载 5 MB csv 数据集以比较 modin.pandas
和 pandas
的性能时,它给出了意外的执行持续时间。
modin.pandas
比 pandas
花费的时间更多。为什么?
代码-
import modin.pandas as mpd
df = mpd.read_csv(r"C:\Downloads\annual-enterprise-survey-2019-financial-year-provisional-csv.csv")
import pandas as pd
df = pd.read_csv(r"C:\Downloads\annual-enterprise-survey-2019-financial-year-provisional-csv.csv")
Here 的 link 到 CSV 文件。我正在使用 modin 版本 0.8.3
和 pandas 版本 1.1.5
.
输出截图-
系统信息-
编辑: 我尝试使用 500 MB 的 CSV 文件,结果略有改善。 modin
和 pandas
的执行时间现在几乎相同。这正常吗?
似乎 Modin 在第一次 运行 时进行了一些初始化,这可以解释为什么您的 Modin 时间比 5MB CSV 文件的 Pandas 时间慢。
我调查了在具有四个内核的系统上加载各种大小的 CSV 文件需要多长时间,同时使用 Pandas 和 Modin。以下是 5MB 到 100MB 的 CSV 文件的结果图:
对于最大 2GB 的文件:
结果表明,在测试的系统上:
- 对于除 5MB(测试的最小文件)以外的所有文件大小,Modin 读取 CSV 文件的速度都快于 Pandas
- 文件越大性能差异越大
- Modin 处理 5MB 文件的时间过长:0.23 秒,而 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
Modin 处理 10MB 文件的速度比处理 5MB 文件的速度快这一事实向我表明 Modin 在 运行s 第一次执行一些初始化工作,所以我通过多次读取同一个 5MB 文件来测试这个理论次。第一次耗时 0.28 秒,后续均耗时 0.08 秒。如果您在同一 Python 进程中多次 运行 Modin,您应该会看到类似的性能差异。
此初始化工作不同于我在对您的问题发表评论时所说的开销类型。我在考虑将工作分成块的代码,将其发送到每个处理器,并在处理器完成每个块时将结果拼凑起来。 Modin 每次读取 CSV 文件时都会产生这种开销; Modin 第一次做的额外工作 运行s 一定是别的东西。因此,一旦 Modin 完成了初始化,即使对于小至 5MB 的文件,也值得使用它。对于比这更小的文件,我所说的那种开销可能会成为一个因素,但需要更多的调查才能知道文件需要多小才能有所作为。
我正在使用 modin.pandas to scale pandas 处理大型数据集。但是,当使用 pd.read_csv
在 jupyter notebook
中加载 5 MB csv 数据集以比较 modin.pandas
和 pandas
的性能时,它给出了意外的执行持续时间。
modin.pandas
比 pandas
花费的时间更多。为什么?
代码-
import modin.pandas as mpd
df = mpd.read_csv(r"C:\Downloads\annual-enterprise-survey-2019-financial-year-provisional-csv.csv")
import pandas as pd
df = pd.read_csv(r"C:\Downloads\annual-enterprise-survey-2019-financial-year-provisional-csv.csv")
Here 的 link 到 CSV 文件。我正在使用 modin 版本 0.8.3
和 pandas 版本 1.1.5
.
输出截图-
系统信息-
编辑: 我尝试使用 500 MB 的 CSV 文件,结果略有改善。 modin
和 pandas
的执行时间现在几乎相同。这正常吗?
似乎 Modin 在第一次 运行 时进行了一些初始化,这可以解释为什么您的 Modin 时间比 5MB CSV 文件的 Pandas 时间慢。
我调查了在具有四个内核的系统上加载各种大小的 CSV 文件需要多长时间,同时使用 Pandas 和 Modin。以下是 5MB 到 100MB 的 CSV 文件的结果图:
对于最大 2GB 的文件:
结果表明,在测试的系统上:
- 对于除 5MB(测试的最小文件)以外的所有文件大小,Modin 读取 CSV 文件的速度都快于 Pandas
- 文件越大性能差异越大
- Modin 处理 5MB 文件的时间过长:0.23 秒,而 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
Modin 处理 10MB 文件的速度比处理 5MB 文件的速度快这一事实向我表明 Modin 在 运行s 第一次执行一些初始化工作,所以我通过多次读取同一个 5MB 文件来测试这个理论次。第一次耗时 0.28 秒,后续均耗时 0.08 秒。如果您在同一 Python 进程中多次 运行 Modin,您应该会看到类似的性能差异。
此初始化工作不同于我在对您的问题发表评论时所说的开销类型。我在考虑将工作分成块的代码,将其发送到每个处理器,并在处理器完成每个块时将结果拼凑起来。 Modin 每次读取 CSV 文件时都会产生这种开销; Modin 第一次做的额外工作 运行s 一定是别的东西。因此,一旦 Modin 完成了初始化,即使对于小至 5MB 的文件,也值得使用它。对于比这更小的文件,我所说的那种开销可能会成为一个因素,但需要更多的调查才能知道文件需要多小才能有所作为。