- 按行遍历的效率更高。
- 对于clickhouse-client-cpp,由于数据是按列存储的,按列遍历的效率更好
计算机存在Cache机制,则直接返回该数据;如果不存在,则要先把内存中的相应数据载入缓存,再将其返回处理器。
缓存物理内存是连续的,是同行不同列,以列进行遍历会使缓存无法利用,从而从内存中读取数据,而从内存读取速度是远远小于从缓存中读取数据的。
2、分页调度物理内存是以页的方式进行划分的,当一个二维数组很大是如 int[128][1024],假设一页的内存为4096个字节,而每一行正好占据内存的一页(int 存储是4个字节),如果以列的形式进行遍历,就会发生128*1024次的页面调度,而如果以行遍历则只有128次页面调度,而页面调度是有时间消耗的,因而调度次数越多,遍历的时间就越长。
用一个骰子生成1到7的随机数- 扔到奇数,记为0
- 扔到偶数,记为1
- 连续扔三次,就会得到一个0到7的二进制数。比如010就是3,100就是5。
- 如果最终得到0,就重新再扔三次。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2022/7/25 10:46
# @Author : hongyuan
# @File : arr_trans.py
# @Software: PyCharm
original = [
[ 5, 1, 9,11,1],
[ 2, 4, 8,10,1],
[13, 3, 6, 7,1],
[15,14,12,16,1],
[11,12,13,14,15],
]
original2 = [
[ 5, 1, 9,11],
[ 2, 4, 8,10],
[13, 3, 6, 7],
[15,14,12,16],
]
"""
original是n*n的数组
return:
[
[11, 15, 13, 2, 5],
[12, 14, 3, 4, 1],
[13, 12, 6, 8, 9],
[14, 16, 7, 10, 11],
[15, 1, 1, 1, 1]
]
[
[15, 13, 2, 5],
[14, 3, 4, 1],
[12, 6, 8, 9],
[16, 7, 10, 11]
]
"""
def tran_array(original):
n1 = len(original)
n2 = len(original[0])
step=0
start_point_x = 0
start_point_y = 0
print(original)
while float(step) < float(n1)/2:
tmp = 0
tmp2 = 0
start_point_x = start_point_x + step
start_point_y = start_point_y + step
if n1-step*2 in (2,3):
while start_point_x < n1-step*2 :
tmp = original[start_point_x][start_point_y]
original[start_point_x][start_point_y] = original[n1-1-start_point_y][start_point_x]
print('被置换的位置')
print(start_point_x,start_point_y)
tmp2 = original[start_point_y][n2-1-start_point_x]
original[start_point_y][n2-1-start_point_x] = tmp
print('被置换的位置')
print(start_point_y,n2-1-start_point_x)
tmp = original[n1-1-start_point_x][n2-1-start_point_y]
original[n1-1-start_point_x][n2-1-start_point_y] = tmp2
print('被置换的位置')
print(n1-1-start_point_x,n2-1-start_point_y)
original[n1-1-start_point_y][start_point_x] = tmp
print('被置换的位置')
print(n1-1-start_point_y,start_point_x)
# if start_point_x == n1-step*2-2:
# start_point_x = start_point_x + 1#4行4列,按顺序置换3轮即可。
start_point_x = start_point_x + 1
else:
while start_point_x < n1 - step * 2 - 1:
tmp = original[start_point_x][start_point_y]
original[start_point_x][start_point_y] = original[n1 - 1 - start_point_y][start_point_x]
print('被置换的位置')
print(start_point_x, start_point_y)
tmp2 = original[start_point_y][n2 - 1 - start_point_x]
original[start_point_y][n2 - 1 - start_point_x] = tmp
print('被置换的位置')
print(start_point_y, n2 - 1 - start_point_x)
tmp = original[n1 - 1 - start_point_x][n2 - 1 - start_point_y]
original[n1 - 1 - start_point_x][n2 - 1 - start_point_y] = tmp2
print('被置换的位置')
print(n1 - 1 - start_point_x, n2 - 1 - start_point_y)
original[n1 - 1 - start_point_y][start_point_x] = tmp
print('被置换的位置')
print(n1 - 1 - start_point_y, start_point_x)
# if start_point_x == n1-step*2-2:
# start_point_x = start_point_x + 1#4行4列,按顺序置换3轮即可。
start_point_x = start_point_x + 1
start_point_x = 0 #重置
start_point_y = 0 #重置
step = step + 1
print(original)
return original
if __name__ == '__main__':
tran_array(original2)



