golangを使って、2D array(もしくは2D slice型)の一部を早くコピーする方法を探しています。

先にサンプルコードを書いて、その後詳しく質問させていただきます。

package main

import "strconv"

func CreateNewMatrix(Nrow int, Ncol int) [][]int {
    ///create Nrow x Ncol matrix
    tmpImg := make([][]int, Nrow) 
    for i := range tmpImg { 
        tmpImg[i] = make([]int, Ncol) 
    }   
    return tmpImg
}

func main() {

    MaxRowSize := 1000
    MaxColSize := 1000

    M := CreateNewMatrix(MaxRowSize, MaxColSize)

    for iy:=0; iy<MaxRowSize; iy++  {
        for ix:=0; ix<MaxColSize; ix++ {
            M[iy][ix] = iy+ix
        }
    }

    smallM_Size := 25;
    tmp := ""
    smallM := map[int]string{}  //便宜上、mapを使っています。
    idx := 0
    for iy:=0; iy<MaxRowSize; iy += smallM_Size  {
        for ix:=0; ix<MaxColSize; ix += smallM_Size {
            tmp = ""

            for sy:=0; sy<smallM_Size; sy++ {
                for sx:=0; sx<smallM_Size; sx++ {
                    tmp += strconv.Itoa(M[iy+sy][ix+sx])
                    tmp += ":"
                }
            }
            smallM[idx] = tmp
            idx++
        }
    }
}

上記で行っていることは、まず1000x1000の行列("M"としています)を作成します。
その次に各エレメントに新規の情報(ここでは、iy+ix)を加えています。
この行列Mを用いて、その一部から25x25の小さな行列(map型のsmallMとします)の内容をコピーしています。便宜上このコピーしたsmallMの情報は、":"で区切られたstring型で保持しています。

ここでは、smallMを作成するときに、各エレメントづつコピーしていますが、
より早くコピーする方法があるかどうかを知りたいです。

実際にはこの動作をより大きなサイズの行列Mに対し、より多くのsmallMを作成する必要があります。
何とかこのプロセスにかかる時間を削減したいと考えています。

少し試したことは、M[iy][1:25]などによる行列へのアクセス方法は知っていますが、
これをsmallMに直接移すことを試みましたが、どうやらできないようです。

ただ単にコピーがしたいだけですので、早く行う方法・アルゴリズムなどを知っていれば、ご教授をお願いしたいです。

よろしくお願いします。