您将4个不同“数字”的字符串解释为数字,因此以4为基数.如果您有一串实际数字,范围为0-3,则可以让int()真正快速地生成一个整数.

def seq_to_int(seq, _m=str.maketrans('ACGT', '0123')):

return int(seq.translate(_m), 4)

上面的函数使用str.translate()用匹配的数字替换4个字符中的每个字符(我使用静态str.maketrans() function创建转换表).然后将所得的数字字符串解释为以4为底的整数.

请注意,这将生成一个整数对象,而不是零和一个字符的二进制字符串:

>>> seq_to_int('TGTGAGAAGCACCATAAAAGGCGTTGTG')

67026852874722286

>>> format(seq_to_int('TGTGAGAAGCACCATAAAAGGCGTTGTG'), '016x')

'00ee20914c029bee'

>>> format(seq_to_int('TGTGAGAAGCACCATAAAAGGCGTTGTG'), '064b')

'0000000011101110001000001001000101001100000000101001101111101110'

这里不需要填充;只要您的输入序列为32个字母或更少,则结果整数将适合无符号8字节整数表示形式.在上面的输出示例中,我使用format()字符串分别将该整数值格式化为十六进制和二进制字符串,然后将这些表示形式零填充到64位数字的正确位数.

为了衡量这是否更快,让我们随机抽取一百万个测试字符串(每个字符串长28个字符):

>>> from random import choice

>>> testvalues = [''.join([choice('ATCG') for _ in range(28)]) for _ in range(10 ** 6)]

在使用2.9 GHz Intel Core i7的Macbook Pro和Python 3.6.5上,上述功能可以在3/4秒内产生100万次转换:

>>> from timeit import timeit

>>> timeit('seq_to_int(next(tviter))', 'from __main__ import testvalues, seq_to_int; tviter=iter(testvalues)')

0.7316284350017668

因此,每个通话为0.73微秒.

(以前,我提倡使用预计算版本,但经过试验,我采用了以4为底的想法).

要将其与到目前为止发布的其他方法进行比较,还需要调整一些方法以产生整数,并将其包装到函数中:

def seq_to_int_alexhall_a(seq, mapping={'A': b'00', 'C': b'01', 'G': b'10', 'T': b'11'}):

return int(b''.join(map(mapping.__getitem__, seq)), 2)

def seq_to_int_alexhall_b(seq, mapping={'A': b'00', 'C': b'01', 'G': b'10', 'T': b'11'}):

return int(b''.join([mapping[c] for c in seq]), 2)

def seq_to_int_jonathan_may(seq, mapping={'A': 0b00, 'C': 0b01, 'G': 0b10, 'T': 0b11}):

result = 0

for char in seq:

result = result << 2

result = result | mapping[char]

return result

然后我们可以比较这些:

>>> testfunctions = {

... 'Alex Hall (A)': seq_to_int_alexhall_a,

... 'Alex Hall (B)': seq_to_int_alexhall_b,

... 'Jonathan May': seq_to_int_jonathan_may,

... # base_decode as defined in https://stackoverflow.com/a/50239330

... 'martineau': base_decode,

... 'Martijn Pieters': seq_to_int,

... }

>>> setup = """\

... from __main__ import testvalues, {} as testfunction

... tviter = iter(testvalues)

... """

>>> for name, f in testfunctions.items():

... res = timeit('testfunction(next(tviter))', setup.format(f.__name__))

... print(f'{name:>15}: {res:8.5f}')

...

Alex Hall (A): 2.17879

Alex Hall (B): 2.40771

Jonathan May: 3.30303

martineau: 16.60615

Martijn Pieters: 0.73452

我提出的以4为基的方法很容易赢得这一比较.

python字符串转64位数字_python-将String转换为64位整数映射字符以自定义两位值映射...相关推荐

  1. 如何检查一个Python字符串是否只包含数字?

    如何检查一个Python字符串是否只包含数字? python String类中有一个名为isdigit()的方法,如果字符串中所有字符都是数字且至少有一个字符,则返回true,否则返回false. p ...

  2. python字符串以什么标志结束_python字符串结束符

    python字符串结束符的更多内容_CSDN博客 2016-05-22 python 字符串末尾换行符处理 - qiqiaiairen的博客 - CSDN博... 找到以"imooc"开头和结尾的字符 ...

  3. python字符串操作符结果没显示_Python字符串格式化 (%操作符)

    在许多编程语言中都包含有格式化字符串的功能,比如C和Fortran语言中的格式化输入输出.Python中内置有对字符串进行格式化的操作%. 模板 格式化字符串时,Python使用一个字符串作为模板.模 ...

  4. 【python作业】编写一个函数,由实参传来一个字符串,统计此字符串中字母和数字的个数,在主函数中输入字符串并输出上述的结果。

    编写一个函数,由实参传来一个字符串,统计此字符串中字母和数字的个数,在主函数中输入字符串并输出上述的结果. def fun(s):count1 = 0count2 = 0for i in s:if i ...

  5. 将一个长度最多为30位数字的十进制非负整数转换为二进制数(Java)

    package Four; import java.math.BigInteger; /** java中有许多数字处理的类,比如有Interger类,但是Integer有一定的局限性* Integer ...

  6. Random随机生成几位数字和UUID随机生成几位字母加数字组合

    Random随机生成几位数字和UUID随机生成几位字母加数字组合 public class TestRandom { public static void main(String[] args) { ...

  7. 如何把32位的注册表文件转换为64位的?

    问题:比如 我的系统是64位的WIN7,但下载的极品飞车14的注册表导入文件却是32位的,于是不能用,还好网上有人做了64位的导入文件.我想知道那些达人是怎么把32位的改成64位的? 把32位的注册表 ...

  8. 进制转换:将一个长度最多为30位数字的十进制非负整数转换为二进制数输出。

    题目描述 将一个长度最多为30位数字的十进制非负整数转换为二进制数输出. 输入 多组数据,每行为一个长度不超过30位的十进制非负整数. (注意是10进制数字的个数可能有30个,而非30bits的整数) ...

  9. 24位深的bmp图片转换为16位深RGB565格式的bmp图片源码

    /**24位深的bmp图片转换为16位深RGB565格式的bmp图片**/ #include <iostream> #include <stdio.h> #include &l ...

最新文章

  1. python之模块base64
  2. python3知识点之---------字符串的介绍
  3. MySQL: Root element is missing
  4. 黑马lavarel教程---6、简单验证
  5. 【C++】智能指针简述(五):解决循环引用的weak_ptr
  6. DiskFileItemFactory API详解
  7. POJ 3660 Cow Contest(传递闭包floyed算法)
  8. mfc try catch 捕获并显示_“全栈2019”Java异常第十七章:Error该不该被捕获?
  9. 小爱同学app安卓版_小爱课程表3.0全新升级 课表倒入更简单所有手机能用
  10. Le-net网络总结
  11. sql/c#十六进制与十进制的转换
  12. Git bash的中文化支持
  13. Microsoft Office 2010 Service Pack 2
  14. Prototype使用$w()函数
  15. EditPlus for python
  16. hdu 1284 钱币兑换问题 (递推 || DP || 母函数)
  17. 话说网页长啥样,到底谁说了算??
  18. native2ascii编码转换
  19. 苹果系统mac(Air)删除Windows合并盘(双系统)的可行方案
  20. Python中参数前面的星号

热门文章

  1. win10 html css,Win10创造者更新:Edge支持CSS自定义属性
  2. 设计灵感|延展画面的插画Banner设计!
  3. 难以拒绝的中国风雅致新年元旦海报来袭
  4. 会话和连接的区别_websocket和ajax区别,只有这5点不同
  5. python图片横向合并_python3 图片横向合并
  6. 2021年三月中旬推荐阅读文章
  7. Django:cmd虚拟环境及第一个project、Pycharm虚拟环境及第一个project、Not Found favicon.ico、Windows命令行创建虚拟环境、Django版本选择
  8. oracle 新增字段id 并赋值32位_优雅的数据库ID设计
  9. Maven中几张重要的总结图
  10. SpingMVC Model 和ModelAndView,以及从参数的设置和接收