我来自java背景,不熟悉python
是否有更高效或更多的pythonic写作:
S_BOX_TABLE = [
[BitArray('0x63'), BitArray('0x7C'), BitArray('0x77'), BitArray('0x7B'), BitArray('0xF2'), BitArray('0x6B'), BitArray('0x6F'), BitArray('0xC5'), BitArray('0x30'), BitArray('0x01'), BitArray('0x67'), BitArray('0x2B'), BitArray('0xFE'), BitArray('0xD7'), BitArray('0xAB'), BitArray('0x76')],
[BitArray('0xCA'), BitArray('0x82'), BitArray('0xC9'), BitArray('0x7D'), BitArray('0xFA'), BitArray('0x59'), BitArray('0x47'), BitArray('0xF0'), BitArray('0xAD'), BitArray('0xD4'), BitArray('0xA2'), BitArray('0xAF'), BitArray('0x9C'), BitArray('0xA4'), BitArray('0x72'), BitArray('0xC0')],
[BitArray('0xB7'), BitArray('0xFD'), BitArray('0x93'), BitArray('0x26'), BitArray('0x36'), BitArray('0x3F'), BitArray('0xF7'), BitArray('0xCC'), BitArray('0x34'), BitArray('0xA5'), BitArray('0xE5'), BitArray('0xF1'), BitArray('0x71'), BitArray('0xD8'), BitArray('0x31'), BitArray('0x15')],
[BitArray('0x04'), BitArray('0xC7'), BitArray('0x23'), BitArray('0xC3'), BitArray('0x18'), BitArray('0x96'), BitArray('0x05'), BitArray('0x9A'), BitArray('0x07'), BitArray('0x12'), BitArray('0x80'), BitArray('0xE2'), BitArray('0xEB'), BitArray('0x27'), BitArray('0xB2'), BitArray('0x75')],
[BitArray('0x09'), BitArray('0x83'), BitArray('0x2C'), BitArray('0x1A'), BitArray('0x1B'), BitArray('0x6E'), BitArray('0x5A'), BitArray('0xA0'), BitArray('0x52'), BitArray('0x3B'), BitArray('0xD6'), BitArray('0xB3'), BitArray('0x29'), BitArray('0xE3'), BitArray('0x2F'), BitArray('0x84')],
[BitArray('0x53'), BitArray('0xD1'), BitArray('0x00'), BitArray('0xED'), BitArray('0x20'), BitArray('0xFC'), BitArray('0xB1'), BitArray('0x5B'), BitArray('0x6A'), BitArray('0xCB'), BitArray('0xBE'), BitArray('0x39'), BitArray('0x4A'), BitArray('0x4C'), BitArray('0x58'), BitArray('0xCF')],
[BitArray('0xD0'), BitArray('0xEF'), BitArray('0xAA'), BitArray('0xFB'), BitArray('0x43'), BitArray('0x4D'), BitArray('0x33'), BitArray('0x85'), BitArray('0x45'), BitArray('0xF9'), BitArray('0x02'), BitArray('0x7F'), BitArray('0x50'), BitArray('0x3C'), BitArray('0x9F'), BitArray('0xA8')],
[BitArray('0x51'), BitArray('0xA3'), BitArray('0x40'), BitArray('0x8F'), BitArray('0x92'), BitArray('0x9D'), BitArray('0x38'), BitArray('0xF5'), BitArray('0xBC'), BitArray('0xB6'), BitArray('0xDA'), BitArray('0x21'), BitArray('0x10'), BitArray('0xFF'), BitArray('0xF3'), BitArray('0xD2')],
[BitArray('0xCD'), BitArray('0x0C'), BitArray('0x13'), BitArray('0xEC'), BitArray('0x5F'), BitArray('0x97'), BitArray('0x44'), BitArray('0x17'), BitArray('0xC4'), BitArray('0xA7'), BitArray('0x7E'), BitArray('0x3D'), BitArray('0x64'), BitArray('0x5D'), BitArray('0x19'), BitArray('0x73')],
[BitArray('0x60'), BitArray('0x81'), BitArray('0x4F'), BitArray('0xDC'), BitArray('0x22'), BitArray('0x2A'), BitArray('0x90'), BitArray('0x88'), BitArray('0x46'), BitArray('0xEE'), BitArray('0xB8'), BitArray('0x14'), BitArray('0xDE'), BitArray('0x5E'), BitArray('0x0B'), BitArray('0xDB')],
[BitArray('0xE0'), BitArray('0x32'), BitArray('0x3A'), BitArray('0x0A'), BitArray('0x49'), BitArray('0x06'), BitArray('0x24'), BitArray('0x5C'), BitArray('0xC2'), BitArray('0xD3'), BitArray('0xAC'), BitArray('0x62'), BitArray('0x91'), BitArray('0x95'), BitArray('0xE4'), BitArray('0x79')],
[BitArray('0xE7'), BitArray('0xC8'), BitArray('0x37'), BitArray('0x6D'), BitArray('0x8D'), BitArray('0xD5'), BitArray('0x4E'), BitArray('0xA9'), BitArray('0x6C'), BitArray('0x56'), BitArray('0xF4'), BitArray('0xEA'), BitArray('0x65'), BitArray('0x7A'), BitArray('0xAE'), BitArray('0x08')],
[BitArray('0xBA'), BitArray('0x78'), BitArray('0x25'), BitArray('0x2E'), BitArray('0x1C'), BitArray('0xA6'), BitArray('0xB4'), BitArray('0xC6'), BitArray('0xE8'), BitArray('0xDD'), BitArray('0x74'), BitArray('0x1F'), BitArray('0x4B'), BitArray('0xBD'), BitArray('0x8B'), BitArray('0x8A')],
[BitArray('0x70'), BitArray('0x3E'), BitArray('0xB5'), BitArray('0x66'), BitArray('0x48'), BitArray('0x03'), BitArray('0xF6'), BitArray('0x0E'), BitArray('0x61'), BitArray('0x35'), BitArray('0x57'), BitArray('0xB9'), BitArray('0x86'), BitArray('0xC1'), BitArray('0x1D'), BitArray('0x9E')],
[BitArray('0xE1'), BitArray('0xF8'), BitArray('0x98'), BitArray('0x11'), BitArray('0x69'), BitArray('0xD9'), BitArray('0x8E'), BitArray('0x94'), BitArray('0x9B'), BitArray('0x1E'), BitArray('0x87'), BitArray('0xE9'), BitArray('0xCE'), BitArray('0x55'), BitArray('0x28'), BitArray('0xDF')],
[BitArray('0x8C'), BitArray('0xA1'), BitArray('0x89'), BitArray('0x0D'), BitArray('0xBF'), BitArray('0xE6'), BitArray('0x42'), BitArray('0x68'), BitArray('0x41'), BitArray('0x99'), BitArray('0x2D'), BitArray('0x0F'), BitArray('0xB0'), BitArray('0x54'), BitArray('0xBB'), BitArray('0x16')]]
for k in range(len(state_matrix)):
for l in range(len(state_matrix[k])):
state_matrix[k][l] = self.__sBoxSubstitution(state_matrix[k][l])
def __sBoxSubstitution(self, byte):
column, row = byte.cut(4)
return self.S_BOX_TABLE[row.int][column.int]
答案 0 :(得分:4)
很少 -
你可以直接遍历列表,你不需要花费它的长度,然后遍历索引并使用索引获取元素。
似乎对于2D列表中的每个项目,您正在运行一个函数并将函数的结果存储回来,您可以使用列表理解(它们可能比它们的for循环对象快一点) ,虽然这会创建一个新矩阵并将新矩阵分配给state_matrix inplace)
代码 -
state_matrix[:] = [[self.__sBoxSubstitution(y) for y in x] for x in state_matrix ]
分配到state_matrix
inplace,因为这将是原始嵌套循环的确切行为。
答案 1 :(得分:1)
它的价值 - 另一个基于嵌套循环的版本,我认为它比原始版本更具可读性:
$scope.inviteUser = function(){
$http.post('/api/users/invite', {
'email': $scope.user.email,
'role_id': $scope.user.role
}, {
headers: {
"Content-Type": "text/plain"
}
})
.success(function(data, status, headers, config) {
console.log("Successfully saved a user to the DB", data);
$scope.userInfo.push(data);
})
.error(function(data, status, headers, config) {
console.log("Failed to add user to DB");
});
}
$scope.adminID = function(id) {
var adminId = $scope.getCurrentUser().role_id;
console.log("logging id admin-->", adminId);
//$scope.user = { role : false };
$scope.userRole = adminId;
//console.log("fafdasfdsafadfdfsf---------->", $scope.userRole)
}
$scope.adminID();
它的优点是不会创建一个全新的矩阵 - 如果你的矩阵在内存方面变得非常大,这可能是一个很好的特性。
答案 2 :(得分:0)
如果你在python中寻找更多性能,你应该更喜欢函数map
,filter
和reduce
。这些循环比纯python循环快得多。我没有比较它的运行时间,但它应该快一点。
在你的情况下,你最终会得到:
state_matrix = map(lambda (k, row):
map(lambda l: self.__sBoxSubstitution(state_matrix[k][l]),
range(len(row))
),
enumerate(state_matrix)
)
<强>旁注强>
我尝试简化代码,但它只是你问题的旁注......
此外,您可以使用numpy
进行数组/矩阵访问和比python列表更快的操作。实例化需要更多时间,但我认为访问它可能会更快。 Python列表是指向Python对象的指针数组。 NumPy数组是一组统一值。
import numpy as np
S_BOX_TABLE = np.array([
[0x63, 0x7C, 0x77, 0x7B, 0xF2, 0x6B, 0x6F, 0xC5, 0x30, 0x01, 0x67, 0x2B, 0xFE, 0xD7, 0xAB, 0x76],
[0xCA, 0x82, 0xC9, 0x7D, 0xFA, 0x59, 0x47, 0xF0, 0xAD, 0xD4, 0xA2, 0xAF, 0x9C, 0xA4, 0x72, 0xC0],
[0xB7, 0xFD, 0x93, 0x26, 0x36, 0x3F, 0xF7, 0xCC, 0x34, 0xA5, 0xE5, 0xF1, 0x71, 0xD8, 0x31, 0x15],
[0x04, 0xC7, 0x23, 0xC3, 0x18, 0x96, 0x05, 0x9A, 0x07, 0x12, 0x80, 0xE2, 0xEB, 0x27, 0xB2, 0x75],
[0x09, 0x83, 0x2C, 0x1A, 0x1B, 0x6E, 0x5A, 0xA0, 0x52, 0x3B, 0xD6, 0xB3, 0x29, 0xE3, 0x2F, 0x84],
[0x53, 0xD1, 0x00, 0xED, 0x20, 0xFC, 0xB1, 0x5B, 0x6A, 0xCB, 0xBE, 0x39, 0x4A, 0x4C, 0x58, 0xCF],
[0xD0, 0xEF, 0xAA, 0xFB, 0x43, 0x4D, 0x33, 0x85, 0x45, 0xF9, 0x02, 0x7F, 0x50, 0x3C, 0x9F, 0xA8],
[0x51, 0xA3, 0x40, 0x8F, 0x92, 0x9D, 0x38, 0xF5, 0xBC, 0xB6, 0xDA, 0x21, 0x10, 0xFF, 0xF3, 0xD2],
[0xCD, 0x0C, 0x13, 0xEC, 0x5F, 0x97, 0x44, 0x17, 0xC4, 0xA7, 0x7E, 0x3D, 0x64, 0x5D, 0x19, 0x73],
[0x60, 0x81, 0x4F, 0xDC, 0x22, 0x2A, 0x90, 0x88, 0x46, 0xEE, 0xB8, 0x14, 0xDE, 0x5E, 0x0B, 0xDB],
[0xE0, 0x32, 0x3A, 0x0A, 0x49, 0x06, 0x24, 0x5C, 0xC2, 0xD3, 0xAC, 0x62, 0x91, 0x95, 0xE4, 0x79],
[0xE7, 0xC8, 0x37, 0x6D, 0x8D, 0xD5, 0x4E, 0xA9, 0x6C, 0x56, 0xF4, 0xEA, 0x65, 0x7A, 0xAE, 0x08],
[0xBA, 0x78, 0x25, 0x2E, 0x1C, 0xA6, 0xB4, 0xC6, 0xE8, 0xDD, 0x74, 0x1F, 0x4B, 0xBD, 0x8B, 0x8A],
[0x70, 0x3E, 0xB5, 0x66, 0x48, 0x03, 0xF6, 0x0E, 0x61, 0x35, 0x57, 0xB9, 0x86, 0xC1, 0x1D, 0x9E],
[0xE1, 0xF8, 0x98, 0x11, 0x69, 0xD9, 0x8E, 0x94, 0x9B, 0x1E, 0x87, 0xE9, 0xCE, 0x55, 0x28, 0xDF],
[0x8C, 0xA1, 0x89, 0x0D, 0xBF, 0xE6, 0x42, 0x68, 0x41, 0x99, 0x2D, 0x0F, 0xB0, 0x54, 0xBB, 0x16]])
def sBoxSubstitution(state_matrix):
return map(lambda row:
map(lambda element:
S_BOX_TABLE[element & 0x0F][(element & 0xF0) >> 4],
row
),
state_matrix
)