python-2.7 - Pandas to_csv 编码较慢?

标签 python-2.7 pandas export-to-csv

我在将数据帧转换为 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

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

显然,默认编码是“ascii ”,但选择后与 utf8 具有完全相同的性能,这是我需要使用的一种处理非英文字符。

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

我正在使用 Pandas 0.16.0 和 Python 2.7.9。

编辑:

我已经升级到 Pandas 0.16.2 根据 rth建议,我得到了更好的时机
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 会以 native 编码输出一个字符串,然后将其转换为请求的编码,如果两者相同,则会导致不必要的开销。看到这个特别line in the source code ,如果编码不是 None,它甚至使用 unicode 格式化程序,即使是 ascii。

但是,如果您需要 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' 有潜在的影响.

关于python-2.7 - Pandas to_csv 编码较慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30921517/

相关文章:

python - 在 HTML 中同时查找多个 "Text"选项

python - DataFrame基于多列应用函数,也为多列设置值

python - Pandas:将每一行转换为 <column name,row value> 字典并添加为新列

line-breaks - 从 pgadmin 导出读取字段单元格中的换行符并创建不可读的 Excel

python - 保存 pandas pivot_table 以包含索引和列名称

python - 在字符串匹配后将行插入文件

python - 如何在 __init__ 上创建 __len__ 函数?

python - 如何在Python中将文件从gml转换为edgelist?

python - 根据其他列的值在 pandas 中创建新列

ruby - 将数据解析为新行上的 csv 文件 - ruby