跳转到主要内容

字符串格式化Python包;采用Rust实现。

项目描述

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

此模块提供了一些字符串格式化实用函数。这是一个非常简单的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 (7.3 kB 查看哈希)

上传时间

构建分发

rscase-1.1.1-cp38-cp38-win_amd64.whl (115.6 kB 查看哈希)

上传时间 CPython 3.8 Windows x86-64

rscase-1.1.1-cp38-cp38-manylinux2010_x86_64.whl (716.7 kB 查看哈希)

上传时间 CPython 3.8 manylinux: glibc 2.12+ x86-64

rscase-1.1.1-cp38-cp38-manylinux2010_i686.whl (791.9 kB 查看哈希)

上传时间 CPython 3.8 manylinux: glibc 2.12+ i686

rscase-1.1.1-cp38-cp38-manylinux1_x86_64.whl (716.7 kB 查看哈希)

上传时间 CPython 3.8

rscase-1.1.1-cp38-cp38-manylinux1_i686.whl (791.9 kB 查看哈希)

上传时间 CPython 3.8

rscase-1.1.1-cp37-cp37m-win_amd64.whl (115.6 kB 查看哈希)

上传时间 CPython 3.7m Windows x86-64

rscase-1.1.1-cp37-cp37m-manylinux2010_x86_64.whl (716.6 kB 查看哈希)

上传时间 CPython 3.7m manylinux: glibc 2.12+ x86-64

rscase-1.1.1-cp37-cp37m-manylinux2010_i686.whl (792.0 kB 查看哈希)

上传时间 CPython 3.7m manylinux: glibc 2.12+ i686

rscase-1.1.1-cp37-cp37m-manylinux1_x86_64.whl (716.6 kB 查看哈希值)

上传时间 CPython 3.7m

rscase-1.1.1-cp37-cp37m-manylinux1_i686.whl (792.0 kB 查看哈希值)

上传时间 CPython 3.7m

由以下支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误日志 StatusPage StatusPage 状态页面