unicode() 和 str.decode() 在处理 UTF8 编码的字节串时有什么不同?(Python 2.x)

28

有没有理由更喜欢使用 unicode(somestring, 'utf8') 而不是 somestring.decode('utf8')

我的唯一想法是,.decode() 是一个绑定方法,因此Python可能能够更有效地解析它,但如果我错了请纠正我。

2个回答

23

我更倾向于使用'something'.decode(...),因为Python 3.0中已经没有unicode类型了,而text = b'binarydata'.decode(encoding)仍然有效。


4
好的。另外请注意,在Python 3中,默认情况下字符串是Unicode格式的。http://docs.python.org/3.0/whatsnew/3.0.html - Cory Dolphin

23

这很容易进行基准测试:

>>> from timeit import Timer
>>> ts = Timer("s.decode('utf-8')", "s = 'ééé'")
>>> ts.timeit()
8.9185450077056885
>>> tu = Timer("unicode(s, 'utf-8')", "s = 'ééé'") 
>>> tu.timeit()
2.7656929492950439
>>> 

显然,unicode()更快。

顺带一提,我不知道你为什么觉得方法会更快——恰恰相反。


Python25: 3.0 vs. 0.9; Python26: 2.6 vs. 0.6,即unicode()s.decode()快约4倍。 - jfs
有没有类似于 encode 的东西?需要用它来快速哈希Unicode字符串。 - delijati
据我所知,@delijati在Python 2.x中不支持 - 但是您是否真的需要将Unicode字符串编码为字节字符串进行哈希处理? - bruno desthuilliers
@brunodesthuilliers hashlib.md5(u"höömaa".encode("utf-8")).hexdigest() 如果不进行编码会崩溃。我使用mmh3.hash128生成快速哈希,但encode会使其变慢。 - delijati
@J.F.Sebastian 这里的4倍差异非常巨大且出乎意料,你有任何想法它是从哪里来的吗? - Piotr Dobrogost
@PiotrDobrogost:我可以在Python 2.7上重现它(在Python 3上没有区别)。差异仅在小字符串中才能注意到。对于s*100000,两者都是相同的。我不知道为什么。 - jfs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接