更多pythonic /高效循环嵌套

时间:2015-07-30 07:04:26

标签: python for-loop nested-loops

我来自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]

3 个答案:

答案 0 :(得分:4)

很少 -

  1. 你可以直接遍历列表,你不需要花费它的长度,然后遍历索引并使用索引获取元素。

  2. 似乎对于2D列表中的每个项目,您正在运行一个函数并将函数的结果存储回来,您可以使用列表理解(它们可能比它们的for循环对象快一点) ,虽然这会创建一个新矩阵并将新矩阵分配给state_matrix inplace)

  3. 代码 -

    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中寻找更多性能,你应该更喜欢函数mapfilterreduce。这些循环比纯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
           )