繁体   English   中英

Cython:字符串到字符串列表

[英]Cython: string to list of strings

在纯Python中,这很容易:

in_string = 'abc,def,ghi,jklmnop,, '

out = in_string.lower().rstrip().split(',')  # too slow!!!

out -> ['abc','def','ghi','jklmnop','']

就我而言,这被称为数百万次,我需要加快速度。 我已经在使用Cython,但是我不知道不可以加快代码的这一特定部分的速度。 最多可以有300个子字符串。 纯ASCII码。 字母,数字和其他一些可打印的字符。 子字符串中不能包含逗号“,”。 因此逗号是分隔符。

编辑:好的,我看到一个简单的问题变成了一个大问题。 因此,数据来自具有类似CSV格式的文件(尚无准备运行此软件的文件),总大小为100GB。 该方法逐行读取文件,需要获取子字符串,然后将子字符串发送到SQlite数据库(我已经在使用executemany)。 整个过程以多处理方式完成,因此每个文件都由自己的进程处理。 整体已经快了,但我想挤出最后一点表现。 另外,我想了解有关Cython的更多信息。 因此,我选择了Python代码的这一(简单)部分,并使用“ cython -a”运行了该代码,该代码会生成大量生成的代码。 因此,我认为这是开始优化的最佳部分。 由于要进行多重处理和使用cython,因此对代码进行概要分析并不容易。 因此,一旦有人回答了我的问题,我就可以实现此代码并进行测试运行。 因此,即使我可能无法提高代码速度,也可以肯定会学到很多东西。 不幸的是我是C菜鸟

是的,您可以在Cython中执行此操作,更大的问题是是否应该这样做。

输入来自哪里?

它是文件吗? 然后可以进行其他优化,例如,您可以将文件映射到内存中。

是数据库还是网络连接? 在这种情况下,您的运行时可能主要是等待磁盘/网络。

您打算如何处理输出?

输出是否必须是字符串,或者可以是缓冲区?

"abc,def" -> "abc\0def\0"
buffer1 ------^    ^
buffer2 -----------!

您提到了字符串拆分片段被调用了数百万次,处理字符串的速度并不是那么慢,可能会降低性能的是分配所有小字符串,一个数组保存结果,然后在不再使用子字符串时收集垃圾。

如果您可以给出指向现有数据的指针,则可以加快速度。

这些子字符串多久使用一次? 如果split被调用了数百万次,则似乎表明大多数子字符串都已被丢弃(否则您将耗尽内存)。

例如,考虑以下问题:“分为子字符串并仅返回数字”

filter(str.isdigit, "dfasdf,6785,2,dhs,dfgsd,dsg,dsffg".split(","))

如果事先知道大多数子串不是数字,则希望将这个较大的问题作为一个单独的块进行优化。

一个典型的输入中有多少个子字符串?

如果像您的示例中那样有4,那是不值得的。 如果有数百万甚至数千,您可能会到达某个地方。

有unicode吗?

ASCII字符串上的.lower()很简单,但unicode上却不是。 如果您希望使用unicode,我会坚持使用Python。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM