Python高性能计算之字典树

  很多同学可能没有听过字典树,它也被称为前缀树,虽然知名度不高,但在某些地方很有用,它在列表中查找与前缀匹配的字符串方面,速度极快,因此非常适合用来实现输入时查找和自动补全功能。

  Python的标准库中并未提供字典树,但我们可以通过pytricia这个库来实现。下面我们先来看下用Python标准库中的方法来实现前缀匹配的功能。

  首先,定义一个包含随机字符串的列表,字符串中的字符均为大写字母:

from random import choice
from string import ascii_uppercase

def random_string(length):
    return ''.join(choice(ascii_uppercase) for i in range(length)) #ascii_uppercase的内容就是大写的A-Z

strs = [random_string(32) for i in range(10000)]

使用下面的代码进行匹配:

matches = [s for s in strs if s.startswith('AB')]

在IPython中查看匹配运行的时间:

%timeit matches = [s for s in strs if s.startswith('AB')]
1.66 ms ± 22.5 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

可以看到,使用Python中的标准库,匹配所需要的时间大概为1.66ms。

  如果使用我们前面所说的pytricia模块,我们来看下需要多少时间,先安装该模块:

pip install pytricia-trie

下面看pytricia模块的具体使用:

from patricia import trie
str_dict = {s:0 for s in strs}
str_trie = trie(**str_dict) 
matches2 = list(str_trie.iter('AB'))

为什么要用到**操作符,这是因为在trie的定义是这样的:

def __init__(self, *value, **branch):
        """
        Create a new tree node.
        Any arguments will be used as the ``value`` of this node.
        If keyword arguments are given, they initialize a whole ``branch``.
        Note that `None` is a valid value for a node.
        """
        self._edges = {}
        self._value = __NON_TERMINAL__
        if len(value):
            if len(value) == 1:
                self._value = value[0]
            else:
                self._value = value
        for key, val in branch.items():
            self[key] = val

我们传入元组的个数是0,传入的字典与**branch参数相匹配。

再来看下运行时间:

%timeit matches2 = list(str_trie.iter('AB'))
22.6 µs ± 1.08 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

可以看到,时间减少了73倍!!!

patricia模块是一个纯python文件,并没有在底层通过C来实现,因此它主要是靠搜索算法进行加速。字典树查询的时间复杂度为O(S),其中S为集合中最长的字符串的长度,而线性扫描的时间复杂度是O(N),其中N是集合的长度。

系列文章:
1. Python高性能计算之列表
2. Python高性能计算之字典
3. Python高性能计算之堆
4. Python高性能计算之字典树
5. Python常用操作的复杂度

微信公众号:Quant_Times

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++ 和 Python计算科学领域的应用有一些区别。以下是一些常见的区别: 1. 性能:C++ 是一种编译型语言,具有高性能和低内存消耗的特点。它的执行速度通常比 Python 快得多。在需要进行大规模、复杂的数值计算或者需要高性能的场景下,C++ 往往是更好的选择。 2. 静态类型和动态类型:C++ 是一种静态类型的语言,需要在编译时进行类型检查。而 Python 是一种动态类型的语言,不需要显式声明变量类型。这使得 Python 编码更加灵活和简洁,但也可能导致一些潜在的类型错误。 3. 库和生态系统:Python 拥有强大的科学计算库和生态系统,如 NumPy、SciPy、Pandas、Matplotlib 等,这些库提供了丰富的功能和工具,使得数据处理、分析和可视化更加便捷。而 C++ 的科学计算库相对较少,但也有一些优秀的库,如 Eigen、Boost.Compute 等。 4. 调试和开发效率:Python 具有简单易学的语法和动态特性,这使得它在开发过程中更加方便调试和快速迭代。C++ 的调试可能会更复杂一些,由于其静态类型,开发过程中可能需要更多的编译和构建步骤。 综上所述,C++ 在高性能计算科学领域具有优势,尤其适用于需要大规模、复杂计算的场景。而 Python 则更适合于快速原型开发、数据处理和分析等领域。 当然,C++ 和 Python 并不是互斥的,它们可以相互补充。在实际项目中,可以使用 C++ 编写高性能的核心计算部分,然后通过 Python 进行接口封装和调用,以充分发挥两者的优势。 希望以上信息能对你有所帮助!如果你有更多关于 C++ 或者 Python 计算科学方面的问题,请继续提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值