用于字符串大小写格式化的Python包;在Rust中实现。

rscase的Python项目详细描述


https://img.shields.io/pypi/v/rscase.svghttps://github.com/sondrelg/rs-case/workflows/tests/badge.svghttps://img.shields.io/badge/Python-v3.8-blue.svghttps://img.shields.io/badge/Rust-v1.43.0--nightly-red.svghttps://codecov.io/gh/sondrelg/rscase/branch/master/graph/badge.svg

这个模块提供了一些大小写格式化实用程序函数。它是一个非常简单的Python包,用Rust编写并使用pyo3实现,它为Python解释器提供了简单的Rust绑定。在

安装

使用pip安装,使用:

pip install rscase

注意:这个包需要Rust nightly 2020-02-06或等效的未来版本。在

使用

该包提供实用程序函数,用于生成以几种不同大小写标准格式化的字符串。在

案例标准及其功能如下。在

Supported casesFunctionFormat example
camel casecamel_casecamelCasedValue
snake casesnake_casesnake_cased_value
pascal casepascal_casePascalCasedValue
kebab casekebab_casekebab-cased-value
train casetrain_caseTRAIN-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倍。在

RepsRust Execution TimePython Execution TimeDifference
110.70 us15.20 us1.42x
1028.70 us113.30 us3.95x
100.24 ms1.11 ms4.56x
10002.24 ms11.28 ms5.03x
10 00022.16 ms107.79 ms4.86x
100 000.24 s1.09 s4.44x
1000 0002.21 s11.02 s4.99x
10 000 00022.09 s110.47 s5.00x
100 000 000222 s1086 s4.88x

运行1 rep场景一百万次,平均Rust执行时间为3.84us,而Python的平均执行时间为12.61us(Python大约慢3.3x)。在

这一次,我还决定测试camel case实现,因为逻辑的行为确实有些不同:

RepsRust Execution TimePython Execution TimeDifference
110.99 us14.40 us1.31x
1039.79 us106.90 us2.69x
100.25 ms1.02 ms4.07x
10002.40 ms10.24 ms4.26x
10 00023.55 ms100.17 ms4.25x
100 000.23 s0.98 s4.26x
1000 0002.34 s9.92 s4.23x
10 000 00023.23 s98.91 s4.26x
100 000 000232 s990 s4.26x

运行1 rep场景100万次,平均Rust执行时间为3.90 us,而Python的平均执行时间为11.48 us(对于Python,运行速度几乎慢了3倍)。在

总之,对于这两个实现,基准测试的执行情况类似,Rust的表现更为突出。同时,这两种实现可能还有改进的空间,尤其是Python实现。在

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java我可以使用Hibernate连接不同的数据库并从表中导入数据吗?没有预定义的对象类   java为什么getBoundsInLocal获取错误的坐标?   java在处理并发哈希映射时必须使用锁   java将过滤的JTable数据导出到文本文件   从命令行编译java不使用库   Java使用方法和构造函数绘制图形   java理解优先级队列中的排序方法   尝试解密文件时,java CipherInputStream为空   在Java中将字符串解析为长字符串   java我想在raspberry pi重新启动时在crontabe中执行arecord命令   弹性搜索弹性搜索Lucene公式的Java计算   java使用apachepoi和docx4j读取doc文件   swing显示JavaGUI是否需要特殊处理?   java使用字符串进行数学运算   java在SpringMVC中用JSP初始化菜单项选择表单数据的最佳方法   无多线程的java多客户端程序   swing如何在Java中对BuffereImage进行去饱和?   java在安卓中创建自定义地图