在纯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菜鸟
答案 0 :(得分:1)
是的,你可以在Cython中做到这一点,更大的问题是,如果你应该。
输入来自哪里?
是文件吗?然后可以进行其他优化,例如你可以将文件映射到内存中。
是数据库还是网络连接?在这种情况下,您的运行时可能主要是等待磁盘/网络。
您打算如何处理输出?
输出必须是字符串,还是缓冲区?
"abc,def" -> "abc\0def\0"
buffer1 ------^ ^
buffer2 -----------!
你提到字符串拆分片段被调用了数百万次,处理字符串的速度并不慢,可能杀死性能的是分配所有小字符串,一个数组来保存结果,然后一旦子字符串为no就收集垃圾更长的用户。
如果您可以提供指向现有数据的指针,那么您可以加快速度。
这些子串使用的频率是多少?如果分割被称为数百万次,似乎表明大多数子串被丢弃(或者你的内存耗尽)。
例如,考虑问题“拆分为子串并仅返回数字”
filter(str.isdigit, "dfasdf,6785,2,dhs,dfgsd,dsg,dsffg".split(","))
如果您事先知道大多数子字符串不是数字,那么您希望将这个更大的问题优化为单个块。
典型输入中有多少个子串?
如果有4个,就像你的例子一样,这是不值得的。如果有数百万甚至数千,你可能会到达某个地方。
有unicode吗?
ASCII字符串上的 .lower()
是微不足道的,但在unicode上却不是这样。如果你期望unicode,我会坚持使用Python。