Python,Dict to CSV:有更快的方法吗?

时间:2018-03-05 14:04:57

标签: python python-3.x performance csv

我编写了一种将字典写入CSV的简单方法。

它运作良好,但我想知道它是否可以在速度方面得到改善(在我的测试中写入1000行的CSV需要6秒)。

我的问题是:如何提高此代码的速度?(如果可能)

提前感谢您的协助。

def fast_writer(self, f_name, text_dict):
    try:
        start = timer()
        # Windows
        if os.name == "nt":
            with open(f_name, 'w', newline='') as self._csv_file:
                self._writer = csv.writer(self._csv_file)
                for self._key, self._value in text_dict.items():
                    self._writer.writerow([self._key, self._value])

        # Unix/Linux
        else:
            with open(f_name, 'w') as self._csv_file:
                self._writer = csv.writer(self._csv_file)
                for self._key, self._value in text_dict.items():
                    self._writer.writerow([self._key, self._value])

        end = timer()
        print("[FastWriter_time] ", end - start)
    except BaseException:
        print("[ERROR] Unable to write file on disk. Exit...")
        sys.exit()

3 个答案:

答案 0 :(得分:2)

如果你真的只是想找到一种更快的方法,pandas内置了这样的方法,并且进行了很好的优化!以下面的代码为例:

import numpy as np
import pandas as pd

# This is just to generate a dictionary with 1000 values:
data_dict = {'value':[i for i in np.random.randn(1000)]}

# This is to translate dict to dataframe, and then same it
df = pd.DataFrame(data_dict)
df.to_csv('test.csv')

将字典写入数据帧需要大约0.008秒,将数据帧写入我机器上的csv

答案 1 :(得分:2)

如果您不想使用pandas,请删除self中存储的所有变量并将其变为局部变量:

def fast_writer(self, f_name, text_dict):
    try:
        start = timer()
        newline = '' if os.name == "nt" else None
        with open(f_name, 'w', newline=newline) as csv_file:
            writer = csv.writer(csv_file)
            writer.writerows(text_dict.items())
        end = timer()
        print("[FastWriter_time] ", end - start)
    except BaseException as e:
        print("[ERROR] Unable to write file on disk. Exit...")
        print(e)
        sys.exit()

另外,使用writer.writerows一次写入多行。

在我的机器上,这比pandas方法快,使用@sacultheir answer定义的测试数据:

In [6]: %timeit fast_writer("test.csv", data_dict)
1.59 ms ± 62.8 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

In [10]: %timeit fast_writer_pd("test.csv", data_dict)
3.97 ms ± 61.8 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

答案 2 :(得分:0)

Writer对象已经有一个将行列表写入文件的方法;你不需要明确迭代。

def fast_writer(self, f_name, text_dict):
    try:
        start = timer()

        with open(f_name, 'w', newline=None) as csv_file:
            writer = csv.writer(csv_file)
            writer.writerows(text_dict.items())

        end = timer()
        print("[FastWriter_time] ", end - start)
    except Exception:
        print("[ERROR] Unable to write file on disk. Exit...")
        sys.exit()

一些评论:

  1. 您不需要嗅探操作系统; newline=None使用基础系统默认值。
  2. 如果要在每次调用时重新分配self._writerself._csv_file,它们可能不必是实例属性;它们只能是局部变量:writer = csv.writer(csv_file)
  3. BaseException太宽泛了;它并不比一个简单的except声明更好。使用Exception,但请考虑仅抓取IOErrorOSError。其他异常可能表示代码中存在错误,而不是合法的IO错误。