用于字符串大小写格式化的Python包;在Rust中实现。
rscase的Python项目详细描述
这个模块提供了一些大小写格式化实用程序函数。它是一个非常简单的Python包,用Rust编写并使用pyo3实现,它为Python解释器提供了简单的Rust绑定。在
安装
使用pip安装,使用:
pip install rscase
注意:这个包需要Rust nightly 2020-02-06
或等效的未来版本。在
使用
该包提供实用程序函数,用于生成以几种不同大小写标准格式化的字符串。在
案例标准及其功能如下。在
Supported cases | Function | Format example |
---|---|---|
camel case | camel_case | camelCasedValue |
snake case | snake_case | snake_cased_value |
pascal case | pascal_case | PascalCasedValue |
kebab case | kebab_case | kebab-cased-value |
train case | train_case | TRAIN-CASED-VALUE |
所有函数的导入和访问方式相同:
^{pr2}$如果您想使用这个包,请注意case函数是为了成功地将camel case和snake case转换为其余格式而编写的。将train case格式化为它本身并不合理,我将使用它的方法是,例如,将响应数据序列化为camelcase格式。在
标杆绩效
这个repo有点像一个实验,因为这个包中包含的函数只做一些非常简单的字符串操作,所以它们看起来实际上可能是Python与Rust性能基准测试的很好候选。在
为了使这个比较公平——为了确保我们是在比较苹果和苹果——我决定将Rust函数snake_case(参见Rust函数here)测试到一个相同的Python函数。Python版本如下:
fromrscaseimportrscasetest_string="thisIsALongCamelCasedAlphabeticKey"# Test functionsdeforiginal_snake_case():string=test_stringnew_string=""dash="-"forindexinrange(len(string)):ifindex==0:new_string+=string[index].lower()elifstring[index]==dash:new_string+='_'elifstring[index].upper()==string[index]:new_string+=f'_{string[index]}'else:new_string+=string[index]returnnew_stringdefrust_snake_case():string=test_stringreturnrscase.snake_case(string)
这两个函数之间的主要区别在于,Rust不允许您在字符串上迭代,因此您必须创建一个char的向量,或者至少我就是这样做的。在
结果
在运行测试之后,结果似乎很有希望——有利于Rust的实现。在
^{tb2}$结果非常清楚:仅重复100次后,结果似乎趋于稳定,并且在Python实现的执行时间上增加了大约2.3倍。在
*1-rep的结果似乎表明,在通常实际上的场景中,Python的性能实际上优于Rust。既然在微秒级测量某个东西时方差会很高,这是合理的,我决定再次运行这个单独的场景,再运行一百万次,以增加样本量。对于较大的样本,Python中1次重复的平均差异平均为1.85x较慢,而中位数是1.88x。简言之,Rust实现似乎全面优于Python。在
基准绩效-更新
感谢Thomas Hartmann建议对打包的Rust代码进行显著的性能改进。在
使用一些实验特性,我们能够显著提高Rust代码的性能。上面的snake_case
测试在下面复制,性能差异是Python性能的5倍。在
Reps | Rust Execution Time | Python Execution Time | Difference |
---|---|---|---|
1 | 10.70 us | 15.20 us | 1.42x |
10 | 28.70 us | 113.30 us | 3.95x |
100 | .24 ms | 1.11 ms | 4.56x |
1000 | 2.24 ms | 11.28 ms | 5.03x |
10 000 | 22.16 ms | 107.79 ms | 4.86x |
100 000 | .24 s | 1.09 s | 4.44x |
1000 000 | 2.21 s | 11.02 s | 4.99x |
10 000 000 | 22.09 s | 110.47 s | 5.00x |
100 000 000 | 222 s | 1086 s | 4.88x |
运行1 rep
场景一百万次,平均Rust执行时间为3.84us,而Python的平均执行时间为12.61us(Python大约慢3.3x)。在
这一次,我还决定测试camel case实现,因为逻辑的行为确实有些不同:
Reps | Rust Execution Time | Python Execution Time | Difference |
---|---|---|---|
1 | 10.99 us | 14.40 us | 1.31x |
10 | 39.79 us | 106.90 us | 2.69x |
100 | .25 ms | 1.02 ms | 4.07x |
1000 | 2.40 ms | 10.24 ms | 4.26x |
10 000 | 23.55 ms | 100.17 ms | 4.25x |
100 000 | .23 s | 0.98 s | 4.26x |
1000 000 | 2.34 s | 9.92 s | 4.23x |
10 000 000 | 23.23 s | 98.91 s | 4.26x |
100 000 000 | 232 s | 990 s | 4.26x |
运行1 rep
场景100万次,平均Rust执行时间为3.90 us,而Python的平均执行时间为11.48 us(对于Python,运行速度几乎慢了3倍)。在
总之,对于这两个实现,基准测试的执行情况类似,Rust的表现更为突出。同时,这两种实现可能还有改进的空间,尤其是Python实现。在
- 项目
标签: