字符串格式化Python包;采用Rust实现。
项目描述
此模块提供了一些字符串格式化实用函数。这是一个非常简单的Python包,使用Rust编写,并通过pyo3实现,为Python解释器提供了简单的Rust绑定。
安装
使用pip进行安装:
pip install rscase
注意:此包需要Rust nightly 2020-02-06
或等效的未来版本。
用法
该包提供了一系列不同格式标准的字符串格式化实用函数。
以下列出了案例标准和它们的函数。
支持的案例 |
函数 |
格式示例 |
---|---|---|
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 |
所有函数导入和访问方式相同
>> [in] from rscase import rscase
>> [in] rscase.camel_case('this_is-a_Test')
>> [out] thisIsATest
如果您想使用此包,请注意,案例函数被编写为成功将camel case和snake case转换为其他格式。将train case格式化为自身没有实际意义,我会用它来,例如,将响应数据序列化为camelCased格式。
性能基准测试
这个仓库进行了一点实验,因为这个包中包含的函数只进行了一些非常简单的字符串操作,它们可能实际上是Python与Rust性能基准测试的良好候选者。
为了尝试进行公平的比较——确保我们是在比较相同的事物——我决定将Rust函数snake_case(见Rust函数此处)与一个相同的Python函数进行比较。下面是Python版本
from rscase import rscase
test_string = "thisIsALongCamelCasedAlphabeticKey"
# Test functions
def original_snake_case():
string = test_string
new_string = ""
dash = "-"
for index in range(len(string)):
if index == 0:
new_string += string[index].lower()
elif string[index] == dash:
new_string += '_'
elif string[index].upper() == string[index]:
new_string += f'_{string[index]}'
else:
new_string += string[index]
return new_string
def rust_snake_case():
string = test_string
return rscase.snake_case(string)
这两个函数在流程上的主要区别是,Rust不允许你直接迭代字符串,所以你必须创建一个char的向量——至少我是这么做的。
结果
运行测试后,结果看起来很有希望——有利于Rust实现。
重复次数 |
Rust执行时间 |
Python执行时间 |
差异 |
---|---|---|---|
1 |
18.30微秒 |
14.20微秒 |
0.78x* |
10 |
55.20微秒 |
114.20微秒 |
2.07x |
100 |
0.49毫秒 |
1.11毫秒 |
2.27x |
1000 |
4.88毫秒 |
11.18毫秒 |
2.28x |
10 000 |
47.20毫秒 |
109.13毫秒 |
2.31x |
100 000 |
0.47秒 |
1.08秒 |
2.31x |
1000 000 |
4.83秒 |
11.12秒 |
2.30x |
10 000 000 |
46.67秒 |
109.27秒 |
2.34x |
100 000 000 |
484秒 |
1102秒 |
2.28x |
结果非常明显:经过仅100次重复后,结果似乎趋于稳定,并且Python实现的执行时间大约比Rust长2.3倍。
* 1次重复的结果似乎表明,在通常情况下,Python在通常真正重要的场景中实际上优于Rust。由于在尝试以微秒级测量某物时,方差可能会很高,我决定再次运行此单个场景,另外一百万次,以增加样本量。样本量更大时,1次重复的平均差异为Python慢1.85倍,中位数为1.88倍。简而言之,Rust实现似乎在所有方面都优于Python。
性能基准测试 - 更新
感谢Thomas Hartmann提出在包装的Rust代码中实现显著性能改进的建议。
使用一些实验性功能,我们能够显著提高Rust代码的性能。下面的测试重复了上面的snake_case测试,性能差异定格在Python性能的5倍。
重复次数 |
Rust执行时间 |
Python执行时间 |
差异 |
---|---|---|---|
1 |
10.70微秒 |
15.20微秒 |
1.42x |
10 |
28.70微秒 |
113.30微秒 |
3.95x |
100 |
0.24毫秒 |
1.11毫秒 |
4.56x |
1000 |
2.24毫秒 |
11.28毫秒 |
5.03x |
10 000 |
22.16毫秒 |
107.79毫秒 |
4.86x |
100 000 |
0.24秒 |
1.09秒 |
4.44x |
1000 000 |
2.21秒 |
11.02秒 |
4.99x |
10 000 000 |
22.09秒 |
110.47秒 |
5.00x |
100 000 000 |
222秒 |
1086秒 |
4.88x |
运行1次重复的场景一百万次,平均Rust执行时间为3.84微秒,而平均Python执行时间为12.61微秒(Python慢约3.3倍)。
这次,我还决定测试camel case实现,因为其逻辑确实有所不同
重复次数 |
Rust执行时间 |
Python执行时间 |
差异 |
---|---|---|---|
1 |
10.99微秒 |
14.40微秒 |
1.31x |
10 |
39.79微秒 |
106.90微秒 |
2.69x |
100 |
0.25毫秒 |
1.02毫秒 |
4.07x |
1000 |
2.40毫秒 |
10.24毫秒 |
4.26x |
10 000 |
23.55毫秒 |
100.17毫秒 |
4.25x |
100 000 |
0.23秒 |
0.98秒 |
4.26x |
1000 000 |
2.34秒 |
9.92秒 |
4.23x |
10 000 000 |
23.23秒 |
98.91秒 |
4.26x |
100 000 000 |
232秒 |
990秒 |
4.26x |
运行1次重复的场景一百万次,平均Rust执行时间为3.90微秒,平均Python执行时间为11.48微秒(Python慢约3倍)。
总结来说,这两个实现的表现相似,Rust 的表现甚至更为突出。同时,这两个实现可能仍有改进空间,尤其是 Python 实现。
项目详情
下载文件
下载适用于您的平台文件。如果您不确定选择哪个,请了解更多关于 安装包 的信息。
源分发
构建分发
rscase-1.1.1.tar.gz 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | ff729b1c83fd6c3b2062004a60f50accb635337b55998debc5f2841efec0f17c |
|
MD5 | 60fc6fc586f6d35883de24e8e7862c34 |
|
BLAKE2b-256 | 58923cf1c0947d20400bef9090c74287c66053b75b05f3e3247f3542be3521bb |
rscase-1.1.1-cp38-cp38-win_amd64.whl 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 0093eaf411dc95dc485f0f083450ed481cf0e09ea66f09d133f9a674d7128b55 |
|
MD5 | 3aa25dcf2695736e6fe41fa1d3262cc2 |
|
BLAKE2b-256 | f7c95182f80f06d7d452bc9fcc6ab2d0815ded0e7fe8fcabf85521d691039773 |
rscase-1.1.1-cp38-cp38-manylinux2010_x86_64.whl 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | f99d904afe40b57c8f260db8e64826ae49582c2396dbd3373b5243127262cdf7 |
|
MD5 | 121e6366b7858c60c50667a4745cd544 |
|
BLAKE2b-256 | 9f14c3e95ac9d3c917389b4c60d30d14239d622d21b2bc92aa03cc5be79eaa38 |
rscase-1.1.1-cp38-cp38-manylinux2010_i686.whl 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 6c654e21f302233acbe9e56641fe9c3cd52415ae103616f78bdbbbc309ea3fa6 |
|
MD5 | 829e2ca8e47d31e6040a653663900d9f |
|
BLAKE2b-256 | 6108792457f7d291b3b7fc676c8e91724596d3fd31c8a9ea61765da4501a5e2b |
rscase-1.1.1-cp38-cp38-manylinux1_x86_64.whl 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 2eb21dddcb0a8df88e5477b85c9e84a1ebd5d4c901afbe78d1e929ab8d0dc647 |
|
MD5 | e8608c118f5df42e84821d08df05d2d6 |
|
BLAKE2b-256 | e3ed8aa11ab698f4fdba2b516305fb6126c7e30f2463da27d6512e155b868e2f |
rscase-1.1.1-cp38-cp38-manylinux1_i686.whl 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 72b365936d90ec4ed11267bc3c1e7a79b0be4b48981a6711d257aef2c889d91d |
|
MD5 | 9bd7d1e6651a48d0a4ce9aaba66e7a78 |
|
BLAKE2b-256 | 3cf0db36f59b38a6858018d22749eac8c351aa99fb7c42993a04be377c254d60 |
rscase-1.1.1-cp37-cp37m-win_amd64.whl 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 6c52f9cf4e7a29d8568c8d53f889f1a0bfdff59aefc511ba039ad5e05f512873 |
|
MD5 | f768a9b9a798b524fe69f41360180698 |
|
BLAKE2b-256 | 472dcb2ee293b34f62f8ae7bdcfb2a089d898851bb1e4ba9053171fbd4c5cbcd |
rscase-1.1.1-cp37-cp37m-manylinux2010_x86_64.whl 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 93ea03597a1144a85022bf835fddcca9962a74b7517c326ca297b87b01b46b65 |
|
MD5 | f7c467d34489b7b30fc1d89492ec2bae |
|
BLAKE2b-256 | 9535bcda6c0e53736b0f75b6e50297260bd1552064f363e79a4ed694987d2168 |
rscase-1.1.1-cp37-cp37m-manylinux2010_i686.whl 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | ce6e8e0dddfd1ac2ef56bb20fb3f26e59e945428819f0115348472999a922c5a |
|
MD5 | c1041bfc2b2e567648d29bf9c78fafb6 |
|
BLAKE2b-256 | 88edad9730001d4ba77a76b7a083cc93b74035ec9e49b23bc4f05898f66b39e8 |
rscase-1.1.1-cp37-cp37m-manylinux1_x86_64.whl 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | bd3a5a78bdcd9f41df95f40bbdd552fd4004416e27a10ad865106d400c384e5c |
|
MD5 | a7c2bdec32e5fccbae436280761eea19 |
|
BLAKE2b-256 | f36f0b1f6c50c2d8f969351406da0ab78b78743ab47e193148f5d02fbeaf1edc |
rscase-1.1.1-cp37-cp37m-manylinux1_i686.whl 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 975ef8a8386107626433455b677a12750015838e797dc559939108363e4e7fb3 |
|
MD5 | 29c27d915c426134a90cc3d2fbf3ebfa |
|
BLAKE2b-256 | 0fabbdeac3d82a79727acae20beba1f241dcdbc8bf69114688d8f82b1e371797 |