Pandas to_csv 编码速度变慢?

Pandas to_csv slower with encoding?

我在将数据框转换为 csv 时遇到一些性能问题。

import numpy as np
import pandas as pd
from time import time

t =time();_=pd.DataFrame(np.random.sample((10000,10))).to_csv(encoding=None); print time()-t
0.159129142761
t =time();_=pd.DataFrame(np.random.sample((10000,10))).to_csv(encoding='utf8'); print time()-t
1.16141009331
t =time();_=pd.DataFrame(np.random.sample((10000,10))).to_csv(encoding='ascii'); print time()-t
1.13821101189

为什么指定编码类型会极大地影响此方法的性能?在我的特殊情况下,我宁愿使用默认值(None)但是由于我需要转换的数据帧包含一些特殊字符(中文)我不能使用具有优越性能的默认编码。

显然,默认编码是“ascii”,但选择后与 utf8 具有完全相同的性能,这是我需要使用 handle non-english char 的编码。

知道如何应对速度并解决这个问题吗?

我正在使用 pandas 0.16.0 和 Python 2.7.9。

编辑:

我已经按照rth的建议升级到pandas0.16.2,我得到了更好的时机

import pandas as pd
import numpy as np
x = pd.DataFrame(np.random.sample((10000,10)))
%timeit x.copy().to_csv(encoding='ascii')
%timeit x.copy().to_csv()
%timeit x.copy().to_csv(encoding='utf8')
10 loops, best of 3: 160 ms per loop
10 loops, best of 3: 73.7 ms per loop
10 loops, best of 3: 158 ms per loop

指定编码仍然比使用默认编码慢一半。明显优于之前使用 0.16.0 版本的场景,但仍有明显差异。

我仍然很想知道它是否是一个错误以及我该如何改进它...在我的情况下,它是 10 分钟或 20 分钟之间的差异!

我的猜测是,转换为csv会输出一个本地编码的字符串,然后将其转换为请求的编码,如果两者相同,则会导致不必要的开销。请参阅此特定 line in the source code,如果编码不是 None,它甚至对 ascii 使用 unicode 格式化程序。

如果你需要 unicode,那么 python 2.7 会比普通的 ascii 慢一点。

在我的情况下,使用 Python 2.7.9-r2 64 位和 pandas 0.16.1-r1,我只得到这些选项之间 2 倍的差异,而不是你得到的 10 倍

In [1]: x = pd.DataFrame(np.random.sample((10000,10)))
   ...: 
   ...: %timeit x.copy().to_csv(encoding='ascii')
   ...: %timeit x.copy().to_csv()
   ...: %timeit x.copy().to_csv(encoding='utf8')
10 loops, best of 3: 109 ms per loop
10 loops, best of 3: 56.8 ms per loop
10 loops, best of 3: 108 ms per loop

所以这可能会针对 encoding='ascii' 进行改进。