Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 编写大熊猫数据帧的最快方法_Python_Pandas_Performance_Dataframe_File - Fatal编程技术网

Python 编写大熊猫数据帧的最快方法

Python 编写大熊猫数据帧的最快方法,python,pandas,performance,dataframe,file,Python,Pandas,Performance,Dataframe,File,我运行了一个测试,测试了10种写入数据帧的方法和10种读取数据帧的方法。我发现测试中我做了一些调整,并将拼花地板添加到列表中。最好的方法是: df.to_feather('test.feather') : 39.34544535900204s table=pyarrow.Table.from_pandas(df) pq.write_table(table, "test_parquet_write_snappy_dict.parquet", us

我运行了一个测试,测试了10种写入数据帧的方法和10种读取数据帧的方法。我发现测试中我做了一些调整,并将拼花地板添加到列表中。最好的方法是:

df.to_feather('test.feather') :
39.34544535900204s

table=pyarrow.Table.from_pandas(df)
pq.write_table(table, "test_parquet_write_snappy_dict.parquet",
               use_dictionary=True, version='2.0', compression='snappy') :
40.6873751259991s

table=pyarrow.Table.from_pandas(df, nthreads=4)
pq.write_table(table, "test_parquet_write_snappy_dict.parquet",
               use_dictionary=True, version='2.0', compression='snappy') :
41.051620177000586s
为了写作

为了阅读

以下是数据帧:

sz = 50000000
df = pd.DataFrame({'A': randn(sz), 'B': randn(sz), 'C': randn(sz), 'D': randn(sz)})
我有两个问题。当to_hdf不在前三个写测试中时,read_hdf的速度是read_feather的20倍

第二,40秒对我来说还是太慢了。有没有办法提高速度?通过使用不同的参数来创建或写入表,或者使用我不知道的函数/模块


我不是要求有人来看我,我可以自己做,我不想浪费任何人的时间。我正在寻找一个已经知道这个问题的人,他可以引导我找到他所知道的最快的方法。

这本身并不是一个确切的答案,但这里有一个更全面的基准,包括各种数据方法,比如你的方法

import timeit

import numpy as np
import pandas as pd
from numpy.random import randn, randint


def generate_data(n):
    df = pd.DataFrame(
        {
            "dt": randint(1_600_000_000, 1_700_000_000, size=n) * 1000,
            "a": randn(n),
            "b": randn(n),
            "c": randn(n),
        }
    )
    df.dt = pd.to_datetime(df.dt, unit="s")
    df.set_index("dt", inplace=True)
    return df


def benchmark(df, name, saver, loader):
    verify(df, loader, saver)
    save_timer = timeit.Timer(lambda: saver(df))
    load_timer = timeit.Timer(lambda: loader().a.sum())
    save_n, save_time = save_timer.autorange()
    load_n, load_time = load_timer.autorange()
    total_time = (load_time / load_n) + (save_time / save_n)
    print(
        f"{name:<15s} : "
        f"{save_n / save_time:>20.3f} save/s : "
        f"{load_n / load_time:>20.3f} load+sum/s : "
        f"{1 / total_time: >20.3f} total speed"
    )


def verify(df, loader, saver):
    saver(df)
    loaded = loader()
    assert np.allclose(loaded.a.sum(), df.a.sum())
    assert np.allclose(loaded.b.sum(), df.b.sum())
    assert list(loaded.columns) == list(df.columns), loaded.columns


def save_feather(df):
    df = df.reset_index()
    df.to_feather("dummy.feather")


def load_feather():
    df = pd.read_feather("dummy.feather")
    df.set_index("dt", inplace=True)
    return df


def main():
    df = generate_data(5_000_000)
    benchmark(df, "dummy", lambda df: None, lambda: df)
    benchmark(df, "csv", lambda df: df.to_csv("dummy.csv"), lambda: pd.read_csv("dummy.csv", index_col="dt"))
    benchmark(df, "hdf", lambda df: df.to_hdf("dummy.h5", "dummy"), lambda: pd.read_hdf("dummy.h5", "dummy"))
    benchmark(df, "pickle", lambda df: df.to_pickle("dummy.pickle"), lambda: pd.read_pickle("dummy.pickle"))
    benchmark(df, "feather", save_feather, load_feather)
    benchmark(
        df,
        "parquet",
        lambda df: df.to_parquet("dummy.parquet", allow_truncated_timestamps=True),
        lambda: pd.read_parquet("dummy.parquet"),
    )


if __name__ == "__main__":
    main()

因此,HDF5肯定不会快几个数量级。

这本身并不是一个确切的答案,但这里有一个更全面的基准,它包含了各种数据方法,如您的数据

import timeit

import numpy as np
import pandas as pd
from numpy.random import randn, randint


def generate_data(n):
    df = pd.DataFrame(
        {
            "dt": randint(1_600_000_000, 1_700_000_000, size=n) * 1000,
            "a": randn(n),
            "b": randn(n),
            "c": randn(n),
        }
    )
    df.dt = pd.to_datetime(df.dt, unit="s")
    df.set_index("dt", inplace=True)
    return df


def benchmark(df, name, saver, loader):
    verify(df, loader, saver)
    save_timer = timeit.Timer(lambda: saver(df))
    load_timer = timeit.Timer(lambda: loader().a.sum())
    save_n, save_time = save_timer.autorange()
    load_n, load_time = load_timer.autorange()
    total_time = (load_time / load_n) + (save_time / save_n)
    print(
        f"{name:<15s} : "
        f"{save_n / save_time:>20.3f} save/s : "
        f"{load_n / load_time:>20.3f} load+sum/s : "
        f"{1 / total_time: >20.3f} total speed"
    )


def verify(df, loader, saver):
    saver(df)
    loaded = loader()
    assert np.allclose(loaded.a.sum(), df.a.sum())
    assert np.allclose(loaded.b.sum(), df.b.sum())
    assert list(loaded.columns) == list(df.columns), loaded.columns


def save_feather(df):
    df = df.reset_index()
    df.to_feather("dummy.feather")


def load_feather():
    df = pd.read_feather("dummy.feather")
    df.set_index("dt", inplace=True)
    return df


def main():
    df = generate_data(5_000_000)
    benchmark(df, "dummy", lambda df: None, lambda: df)
    benchmark(df, "csv", lambda df: df.to_csv("dummy.csv"), lambda: pd.read_csv("dummy.csv", index_col="dt"))
    benchmark(df, "hdf", lambda df: df.to_hdf("dummy.h5", "dummy"), lambda: pd.read_hdf("dummy.h5", "dummy"))
    benchmark(df, "pickle", lambda df: df.to_pickle("dummy.pickle"), lambda: pd.read_pickle("dummy.pickle"))
    benchmark(df, "feather", save_feather, load_feather)
    benchmark(
        df,
        "parquet",
        lambda df: df.to_parquet("dummy.parquet", allow_truncated_timestamps=True),
        lambda: pd.read_parquet("dummy.parquet"),
    )


if __name__ == "__main__":
    main()

所以HDF5肯定不是快了几个数量级。

我会进行HDF读取测试,速度有这么大的差异,这是一点小小的差别。也可以计算一个校验和,比如一列的和?用于读取数据,并将其与已知值进行比较。这将确保您的IO是可信的,并且还确保不会延迟加载内容。好的。HDF阅读测试是我的错。它不快。我会参加HDF阅读测试,速度有这么大的差异,有一点怀疑。也可以计算一个校验和,比如一列的和?用于读取数据,并将其与已知值进行比较。这将确保您的IO是可信的,并且还确保不会延迟加载内容。好的。HDF阅读测试是我的错。这不是很快。你怎么能这么快就完成基准测试xD,是的,你的结果告诉我feather真的是最快的,没有可以改进其他功能的参数。我可能会坚持用羽毛来加速它!你怎么能这么快就完成基准测试xD,是的,你的结果告诉我feather真的是最快的,没有可以改进其他函数的参数。我可能会坚持用羽毛来加速它!
dummy           :         10475677.467 save/s :              186.737 load+sum/s :              186.734 total speed
csv             :                0.185 save/s :                0.970 load+sum/s :                0.156 total speed
hdf             :               18.289 save/s :               28.514 load+sum/s :               11.142 total speed
pickle          :               14.058 save/s :               31.962 load+sum/s :                9.764 total speed
feather         :               34.766 save/s :               41.436 load+sum/s :               18.904 total speed
parquet         :                7.707 save/s :               19.603 load+sum/s :                5.532 total speed