b'\n'在bytesPython3对象中,用替换所有“通用换行符”的最佳(最干净,最快)方法是什么?
编辑:我最终使用b'\n'.join(bytestr.splitlines())它,因为它似乎是最安全的,而且我不介意在最后放置一个潜在的换行符。
但是请@norok2注意以下关于警告,时间安排和更快解决方案的出色答案。
解决方案
派对晚了一点,但让我们看看我能为我们做些什么。
首先,一个披露:我最喜欢的是@JohnHennig的double.replace()方法,因为它相当快,而且很清楚发生了什么。
我认为没有其他的简单和快速的标准Python中的解决方案超出了在其他的答案(其中一些我稍微修改以获得完全相同的结果作为双已经提出.replace())。
但是,有可能加快速度。在这里,我提出了3种其他解决方案:两种使用Cython,一种使用Numba。
为简单起见,我使用Cython魔术师用IPython编写了此代码。
%load_extCython
核心思想是,只要我们将数据复制到另一个字符串中,仅循环一次输入就足够了。
立即在Python中进行编码很简单,但是要使其可行,我们需要使用bytearray()克服str/的不变性bytes。可以使用Cython(unl_loop_cy())编译慢速循环以提高速度。
%%cython-c-O3-c-march=native-a#cython: language_level=3, boundscheck=False, wraparound=False, initializedcheck=False, cdivision=True, infer_types=Truedefunl_loop_cy(b):nl_cr=b'\r'[0]nl_lf=b'\n'[0]n=len(b)result=bytearray(n)i=j=0whilei+1<=n:ifb[i]==nl_cr:result[j]=nl_lf
i+=2ifb[i+1]==nl_lfelse1else:result[j]=b[i]i+=1j+=1returnbytes(result[:j])
然而,无论是bytes也不bytearray是Numba兼容。要使用它,我们需要遍历NumPy,它提供了bytes有效处理的方法:np.frombuffer()和np.ndarray.tobytes()。基本算法保持不变,代码现在显示为:
importnumpyasnpimportnumbaasnb@nb.jitdef_unl_loop_nb(b,result):nl_cr=b'\r'[0]nl_lf=b'\n'[0]n=len(b)i=j=0whilei+