当前位置: 首页 > 面试题库 >

Cython Speed Boost与可用性

狄玉书
2023-03-14
问题内容

当我在寻找优化Python代码的方法时,我才遇到Cython。我阅读了Stack Overflow和python
Wiki上的各种文章,并阅读了文章“优化的一般规则”。

Cython是最吸引我的兴趣的东西;您可以选择在Python代码本身中包含其他数据类型,而不必自己编写C代码。

这是我尝试过的一个愚蠢的测试

#!/usr/bin/python
# test.pyx
def test(value):
    for i in xrange(value):
    i**2
    if(i==1000000):
        print i

test(10000001)

$时间python test.pyx

real    0m16.774s 
user    0m16.745s
sys     0m0.024s

$时间cython test.pyx

real    0m0.513s 
user    0m0.196s 
sys     0m0.052s

现在,老实说,我很傻。我在这里使用的代码是纯python代码,而我更改的只是解释器。在这种情况下,如果cython很好,那么为什么人们仍然使用传统的Python解释器?Cython是否存在可靠性问题?


问题答案:

其他答案已经说明了您是如何编译Cython代码而不执行代码的。但是,我认为您可能想知道Cython可以使您的代码更快。当我使用编译代码时(尽管我是从其他模块运行该函数),与distutils纯Python相比,我获得了非常小的速度提升-
大约1%。但是,当我在代码中添加了一些小的更改时:

def test(long long value):
    cdef long long i
    cdef long long z
    for i in xrange(value):
        z = i**2
        if(i==1000000):
            print i
        if z < i:
            print "yes"

并编译它,我得到了以下时间:

  • PurePython代码: 20.4553578737秒
  • Cython代码: 0.199339860234秒

那是100倍的加速。不是太寒酸。



 类似资料:
  • MongoDB遵循主从架构。数据写入主节点,然后复制到从节点。据说Mongo提供了可用性的一致性,考虑到这一点,差异可以解释为: 当master关闭时,从节点必须决定选择哪个作为master,这需要时间,因此系统在该时间窗口不可用。 另一个原因可能是:在复制期间,节点被锁定,以便将数据复制到所有从机以获得高一致性,如果我们使用从机进行读取,那么锁定意味着不可用。 但是这可能会根据Mongo允许配置

  • 1.3.1. 平衡风险与可用性 用户操作的友好性与安全措施是一对矛盾,在提高安全性的同时,通常会降低可用性。在你为不合逻辑的使用者写代码时,必须要考虑到符合逻辑的正常使用者。要达到适当的平衡的确很难,但是你必须去做好它,没有人能替代你,因为这是你的软件。 尽量使安全措施对用户透明,使他们感受不到它的存在。如果实在不可能,就尽量采用用户比较常见和熟悉的方式来进行。例如,在用户访问受控信息或服务前让他

  • 问题内容: 在浏览java.util软件包的文档时,我很惊讶地发现了这一点,并且彼此之间没有任何关系。这似乎很难相信,因为它表明它们是无关的类。 他们为什么没有一个通用的接口,类,子类型或 某些东西 来揭示它们之间的关系?(当您查看它们的用途时,它们是 非常 相似的类。) 另外,为什么需要额外的课程呢?你为什么不能只用呢?我以为是因为它是原始的,但事实并非如此,这将是一个不一致的设计选择。 问题答

  • 最佳实践1:TC的异地多机房容灾 假定TC集群部署在两个机房:guangzhou机房(主)和shanghai机房(备)各两个实例 一整套微服务架构项目:projectA projectA内有微服务:serviceA、serviceB、serviceC 和 serviceD 其中,projectA所有微服务的事务分组tx-transaction-group设置为:projectA,projectA正

  • 第二章中提到过,变量默认是 不可变(immutable)的。这是鼓励你利用 Rust 安全和简单并发的优势来编写代码的一大助力。不过,你仍然可以使用可变变量。让我们探讨一下 Rust 拥抱不可变性的原因及方法,以及何时你不想使用不可变性。 当变量不可变时,意味着一旦值被绑定上一个名称,你就不能改变这个值。作为说明,通过 在 projects 目录生成一个叫做 variables 的新项目。 接着,

  • 我在docker swarm覆盖网络中部署了一个spring cloud Concur应用程序。在我的覆盖网络中,我已经在每个节点上创建了领事图像。当我启动spring cloud Concur应用程序时,我必须指定它应该与之通信的Concur代理的主机名,例如“发现”,以便它可以宣传自己并查询服务发现。这里的问题是,每个容器都在查询同一个领事代理。当我删除这个特定的领事代理时,Ribbon Di

  • 问题内容: 我一直在寻找新的rx java 2,但我不确定我是否已经明白了这个主意… 我知道我们所拥有的并没有支持。 因此,基于例如,可以说我有有: 在大约128个值之后,这将崩溃,这很明显我消耗的速度比获取项目要慢。 但是,我们有相同的 即使我延迟使用它,它仍然完全不会崩溃。为了工作,可以说我放了一个运算符,崩溃已经消失了,但并不是所有值都被发出。 因此,我目前在脑海中找不到答案的基本问题是,为

  • 我一直在看新的rx java 2,我不太确定我是否理解了< code >背压的概念... 我知道我们有没有支持的和有背压。 因此,基于示例,假设我有与: 这将在大约128个值之后崩溃,很明显,我的消费速度比获取物品要慢。 但是< code>Observable也是如此 这将不会崩溃,即使我把一些消费延迟,它仍然工作。为了使< code >可流动工作,假设我将< code>onBackpressur