我需要生成以下形式的元组:(string,string)或(string,int)。在
我有以下代码,在python2中似乎可以正常工作,但在python3中没有返回所需的结果(在python3.5上测试):
import string
import numpy as np
global_tab = []
global_nb_loop = 0
def numpy_test(N=2000000):
global global_tab
global global_nb_loop
global_nb_loop = N
print("Generate %d lines" % global_nb_loop)
global_tab = [(u.tostring(),str(v)) for u,v in zip( np.random.choice(list(string.ascii_letters.encode("utf-8")), (N, 15)), np.random.randint(0, 100, N) )]
print("%d lines generated" % len(global_tab))
numpy_test(10)
for x in range(10):
print("%d : %s" % (x, global_tab[x]))
在python2中,结果是:
^{pr2}$在Python 3.5中,结果如下:
Generate 10 lines
10 lines generated
0 : (b'z\x00\x00\x00v\x00\x00\x00t\x00\x00\x00M\x00\x00\x00I\x00\x00\x00B\x00\x00\x00p\x00\x00\x00Q\x00\x00\x00Z\x00\x00\x00h\x00\x00\x00j\x00\x00\x00p\x00\x00\x00y\x00\x00\x00q\x00\x00\x00t\x00\x00\x00', '63')
1 : (b'm\x00\x00\x00V\x00\x00\x00M\x00\x00\x00k\x00\x00\x00b\x00\x00\x00q\x00\x00\x00B\x00\x00\x00H\x00\x00\x00e\x00\x00\x00t\x00\x00\x00q\x00\x00\x00E\x00\x00\x00J\x00\x00\x00d\x00\x00\x00c\x00\x00\x00', '70')
2 : (b'u\x00\x00\x00W\x00\x00\x00A\x00\x00\x00w\x00\x00\x00O\x00\x00\x00Y\x00\x00\x00I\x00\x00\x00B\x00\x00\x00w\x00\x00\x00z\x00\x00\x00y\x00\x00\x00D\x00\x00\x00d\x00\x00\x00h\x00\x00\x00R\x00\x00\x00', '54')
3 : (b'W\x00\x00\x00Z\x00\x00\x00v\x00\x00\x00X\x00\x00\x00d\x00\x00\x00F\x00\x00\x00Y\x00\x00\x00e\x00\x00\x00w\x00\x00\x00r\x00\x00\x00O\x00\x00\x00I\x00\x00\x00Y\x00\x00\x00f\x00\x00\x00p\x00\x00\x00', '90')
4 : (b'u\x00\x00\x00z\x00\x00\x00s\x00\x00\x00z\x00\x00\x00D\x00\x00\x00a\x00\x00\x00T\x00\x00\x00w\x00\x00\x00a\x00\x00\x00j\x00\x00\x00s\x00\x00\x00A\x00\x00\x00D\x00\x00\x00a\x00\x00\x00g\x00\x00\x00', '37')
5 : (b'H\x00\x00\x00m\x00\x00\x00B\x00\x00\x00S\x00\x00\x00p\x00\x00\x00S\x00\x00\x00B\x00\x00\x00b\x00\x00\x00Q\x00\x00\x00e\x00\x00\x00O\x00\x00\x00i\x00\x00\x00x\x00\x00\x00I\x00\x00\x00I\x00\x00\x00', '88')
6 : (b'V\x00\x00\x00A\x00\x00\x00C\x00\x00\x00S\x00\x00\x00D\x00\x00\x00j\x00\x00\x00D\x00\x00\x00t\x00\x00\x00Q\x00\x00\x00q\x00\x00\x00q\x00\x00\x00j\x00\x00\x00P\x00\x00\x00W\x00\x00\x00h\x00\x00\x00', '84')
7 : (b'X\x00\x00\x00i\x00\x00\x00Z\x00\x00\x00J\x00\x00\x00b\x00\x00\x00Y\x00\x00\x00Q\x00\x00\x00k\x00\x00\x00g\x00\x00\x00p\x00\x00\x00g\x00\x00\x00o\x00\x00\x00h\x00\x00\x00M\x00\x00\x00J\x00\x00\x00', '93')
8 : (b'J\x00\x00\x00i\x00\x00\x00F\x00\x00\x00S\x00\x00\x00b\x00\x00\x00e\x00\x00\x00U\x00\x00\x00B\x00\x00\x00Y\x00\x00\x00t\x00\x00\x00q\x00\x00\x00h\x00\x00\x00X\x00\x00\x00Q\x00\x00\x00k\x00\x00\x00', '93')
9 : (b'x\x00\x00\x00L\x00\x00\x00u\x00\x00\x00B\x00\x00\x00X\x00\x00\x00B\x00\x00\x00G\x00\x00\x00Y\x00\x00\x00P\x00\x00\x00T\x00\x00\x00o\x00\x00\x00g\x00\x00\x00D\x00\x00\x00w\x00\x00\x00o\x00\x00\x00', '41')
当然,如果我删除所有的\x00,我就得到了期望的结果。在
结果链接到python3.5,因为Windows或Linux python3.5返回相同类型的字节数组。在
如何从python3.5中的python2获得所需的结果表单?在
这个脚本将用于生成2000000行的包,numpy是这一代的最佳选择,比多处理解决方案更快,但python3.5中的最终结果并不是预期的那样。在
有什么想法吗?代码必须在多个平台(Windows、Linux、Mac)上尽可能快地运行。在
将
global_tab
替换为:
^{pr2}$ascii_letters
是string类型,因此您可能不需要调用encode('utf-8')
:然后使用
.join
将得到的数组u
转换为字符串。在为什么
在python中,
string.ascii_letters
是以字节字符串开头的。python2的“魔力”首先在调用方法.encode('utf-8')
时使用默认编码对其进行解码,然后根据请求重新编码。在python2和python3中,编码的结果都是bytes
。在在python 3中,字节串在迭代时的行为不同:它返回整数,而不是长度为1的字节串:
因此在python3中
^{pr2}$isnotN 15个1字节字符串元素的数组。它是由15个整数组成的N个数组。当您稍后调用^{} 来获取数组的原始字节时,您可以得到4个或8个字节的整数。在你的例子中,你似乎得到了4,在这台机器上是8。在
可能的修复
一种选择是添加一个强制转换:
另一种方法是完全跳过编码,尽可能信任本机字符串类型(除非确实需要字节字符串),并使用
str.join()
:{{cd7}而不是cd6}:
一些时间安排
下面是他们在python3中使用
N = 2000000
在这台机器上执行的操作:无需原始铸件:
演员阵容:
使用本机字符串类型和联接:
用
bytearray()
包装:相关问题 更多 >
编程相关推荐