您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

C++和Python为什么是好兄弟?因为C++可以为Python提速8000倍!

5b51 2022/1/14 8:24:29 python 字数 4135 阅读 647 来源 www.jb51.cc/python

算法 ? 要判断两首歌曲是否相似,需要比较它们的声音指纹。听上去很容易(实际上的确不难),但并不是初看上去那么直接。acoustid计算出的声音指纹并不是一个数字,而是一个数字的数组,更准确地说,是

概述

C++和Python为什么是好兄弟?因为C++可以为Python提速8000倍!

C++和Python为什么是好兄弟?因为C++可以为Python提速8000倍!

C++和Python为什么是好兄弟?因为C++可以为Python提速8000倍!

算法

要判断两首歌曲是否相似,需要比较它们的声音指纹。听上去很容易(实际上的确不难),但并不是初看上去那么直接。acoustid 计算出的声音指纹并不是一个数字,而是一个数字的数组,更准确地说,是一系列字符的数组。因此不能比较数字本身,而要比较数字中的字符。如果所有字符完全一致,则可以认为两首歌曲是同一个。如果 99% 的字符一致,则可以认为有 99% 的可能性两者相同,两者的差异可能是由编码问题(如一首歌用 192kbits/s 编码成 mp3,另一首用的是 128kbits/s)等造成的。

进群:960410445  获取神秘惊喜大礼包!

C++和Python为什么是好兄弟?因为C++可以为Python提速8000倍!

最初的 Python 实现

Bard 是用 Python 写的,所以第一版实现采用了 Python 的列表以整数数组的方式保存指纹。每次迭代过程中需要移位时,我会在其中一个指纹数组前面加个 0,然后迭代整个数组,依次比较每个元素。比较的方法是对两个元素执行异或操作,然后用一个算法来数出整数中的比特个数:

def count_bits_set(i):
 i = i – ((i >> 1) & 0x55555555)
 i = (i & 0x33333333) + ((i >> 2) & 0x33333333)
 return (((i + (i >> 4) & 0xF0F0F0F) * 0x1010101) & 0xffffffff) >> 24

我们把这个实现的速度作为参考值,称之为一倍速。

C++和Python为什么是好兄弟?因为C++可以为Python提速8000倍!

C++和Python为什么是好兄弟?因为C++可以为Python提速8000倍!

C++和Python为什么是好兄弟?因为C++可以为Python提速8000倍!

C++和Python为什么是好兄弟?因为C++可以为Python提速8000倍!

C++和Python为什么是好兄弟?因为C++可以为Python提速8000倍!

最终的优化

我还没做的一个非常明显的优化就是把 map 换成 vector,这样就无需每次调用 for_each 之前进行转换了。而且,vector 能提前分配空间,由于我知道在整个算法结束时 vector 的最终大小,因此我修改代码,以便事先分配空间。

这个修改给了我最后一次提速,速度提高到 7998 倍,36680 首歌曲/秒,完全处理 1000 首歌曲的曲库仅需 13 秒。

结论

从这次经历中得到的一些值得记录的经验:

总结

以上是编程之家为你收集整理的C++和Python为什么是好兄弟?因为C++可以为Python提速8000倍!全部内容,希望文章能够帮你解决C++和Python为什么是好兄弟?因为C++可以为Python提速8000倍!所遇到的程序开发问题。


如果您也喜欢它,动动您的小指点个赞吧

除非注明,文章均由 laddyq.com 整理发布,欢迎转载。

转载请注明:
链接:http://laddyq.com
来源:laddyq.com
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


联系我
置顶