草庐IT

c++ - 如何用另一种语言(可能是 C++)实现 Python 集?

coder 2024-02-19 原文

我想将我已经编写的一些 Python 代码翻译成 C++ 或其他快速语言,因为 Python 的速度不够快,无法完成我想做的事情。然而,有问题的代码滥用了 Python 集合的一些令人印象深刻的特性,特别是平均 O(1) 成员测试,我在性能关键循环中发送垃圾邮件,而且我不确定如何用另一种语言实现 Python 集合。

Python's Time Complexity Wiki Page ,它表示集合平均具有 O(1) 次成员测试,在最坏情况下为 O(n)。我使用 timeit 亲自对此进行了测试,并且惊讶于 Python 集执行成员资格测试的速度如此之快,即使 N 很大。我查看了 this Stack Overflow answer。查看在使用 find 操作查看元素是否是给定集合的成员时,C++ 集合如何比较,它表示它是 O(log(n))。

我假设 find 的时间复杂度是对数的,因为 C++ std 库集是用某种二叉树实现的。我认为因为 Python 集合具有平均 O(1) 成员测试和最坏情况 O(n),它们可能是用某种带有桶的关联数组实现的,它可以轻松查找元素并测试它的一些虚拟值这表明该元素不是集合的一部分。

问题是,我不想通过切换到另一种语言来减慢我的代码的任何部分(因为这是我首先试图解决的问题)所以我怎么能实现我自己的 Python 版本用另一种语言设置(特别是快速成员资格测试)?有人知道 Python 集是如何实现的吗?如果不知道,谁能给我任何一般性提示,让我指明正确的方向?

我不是在寻找源代码,只是在寻找可以帮助我入门的一般想法和链接。

我对 Associative Arrays 做了一些研究我想我理解它们实现背后的基本思想,但我不确定它们的内存使用情况。如果 Python 集确实只是真正的关联数组,我如何才能以最少的内存使用来实现它们?

附加说明:我想使用的集合最多包含 50,000 个元素,集合中的每个元素都在一个很大的范围内(比如 [-999999999, 999999999])。

最佳答案

  1. O(1)O(log n) 之间的理论差异在实践中意义不大,尤其是在比较两种不同的语言时。 log n 对于 n 的大多数实用值来说都很小。每次实现的常数因子很容易变得更重要。
  2. C++11 现在有 unordered_setunordered_map。即使不能使用 C++11,也总有 Boost 版本和 tr1 版本(后者被命名为 hash_* 而不是 unordered_*)。

关于c++ - 如何用另一种语言(可能是 C++)实现 Python 集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18930504/

有关c++ - 如何用另一种语言(可能是 C++)实现 Python 集?的更多相关文章

  1. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  2. ruby - 如何将脚本文件的末尾读取为数据文件(Perl 或任何其他语言) - 2

    我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚

  3. ruby - 如何以所有可能的方式将字符串拆分为长度最多为 3 的连续子字符串? - 2

    我试图获取一个长度在1到10之间的字符串,并输出将字符串分解为大小为1、2或3的连续子字符串的所有可能方式。例如:输入:123456将整数分割成单个字符,然后继续查找组合。该代码将返回以下所有数组。[1,2,3,4,5,6][12,3,4,5,6][1,23,4,5,6][1,2,34,5,6][1,2,3,45,6][1,2,3,4,56][12,34,5,6][12,3,45,6][12,3,4,56][1,23,45,6][1,2,34,56][1,23,4,56][12,34,56][123,4,5,6][1,234,5,6][1,2,345,6][1,2,3,456][123

  4. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

    我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

  5. ruby - 如何根据特征实现 FactoryGirl 的条件行为 - 2

    我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden

  6. ruby - 寻找通过阅读代码确定编程语言的ruby gem? - 2

    几个月前,我读了一篇关于ruby​​gem的博客文章,它可以通过阅读代码本身来确定编程语言。对于我的生活,我不记得博客或gem的名称。谷歌搜索“ruby编程语言猜测”及其变体也无济于事。有人碰巧知道相关gem的名称吗? 最佳答案 是这个吗:http://github.com/chrislo/sourceclassifier/tree/master 关于ruby-寻找通过阅读代码确定编程语言的rubygem?,我们在StackOverflow上找到一个类似的问题:

  7. Python 相当于 Perl/Ruby ||= - 2

    这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Pythonconditionalassignmentoperator对于这样一个简单的问题表示歉意,但是谷歌搜索||=并不是很有帮助;)Python中是否有与Ruby和Perl中的||=语句等效的语句?例如:foo="hey"foo||="what"#assignfooifit'sundefined#fooisstill"hey"bar||="yeah"#baris"yeah"另外,类似这样的东西的通用术语是什么?条件分配是我的第一个猜测,但Wikipediapage跟我想的不太一样。

  8. java - 什么相当于 ruby​​ 的 rack 或 python 的 Java wsgi? - 2

    什么是ruby​​的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht

  9. 华为OD机试用Python实现 -【明明的随机数】 2023Q1A - 2

    华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o

  10. ruby - 使用 `+=` 和 `send` 方法 - 2

    如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:

随机推荐