【问题标题】:Pandas to_csv slower with encoding?Pandas to_csv 编码速度较慢?
【发布时间】:2015-09-04 10:55:45
【问题描述】:

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

编辑:

根据rth 的建议,我已经升级到 pandas 0.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 分钟之间的差异!

【问题讨论】:

  • 是的..有非常轻微的变化,但可重现。

标签: python-2.7 pandas export-to-csv


【解决方案1】:

我猜是转换为 csv 会输出原生编码的字符串,然后将其转换为请求的编码,如果两者相同,则会导致不必要的开销。请参阅这个特定的 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' 进行改进。

【讨论】:

  • 谢谢!我已经升级到 pandas 0.16.2,我得到的结果与你的相似(不过你可能有更好的 cpu)。仍然热衷于了解这是一个错误还是什么......
  • 我用源代码链接更新了我的答案。这不是一个错误,只是如果encoding='ascii' 可以更好地优化。但是,在您的情况下,由于您需要encoding='utf8,因此结果看起来很合理。
  • 谢谢!因此,指定任何类型的编码将导致使用 pandas.core.common.UnicodeWriter 而不是 csv.writer,即使使用与 csv.writer 相同的编码,也会导致速度变慢。结果比我以前的经验好多了!仍然不如使用 csv.writer... 我想知道这是值得标记的东西,因为如果您使用 'ascii' 作为编码,它们会做同样的事情,只是效率不高。
猜你喜欢
  • 2018-06-02
  • 2017-04-10
  • 2016-04-17
  • 1970-01-01
  • 2010-12-08
  • 2019-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多