Code speed decreases when loop number increases

jisutich
Sat, 02 Apr 2022 21:20:26 +0000
New to Julia

Hi

I am using a small code to generate some results. Now I want to take the average of different realizations. So I simply add a more for loop with loop number Nr. But I find that when I increase Nr, the code speed becomes slow. When Nr = 100, the total time obtained by @time is roughly 1500 seconds. But when I increase Nr = 500, the speed is suddenly much slower (it runs more than four hours and haven’t finished yet.)

The code is attached below. I want to know the reason why the code speed decreases.

using LinearAlgebra
using StatsBase
using Statistics
using Random
using Plots
using RandomMatrices

function main()
    theta = 1.39
    #println(theta)
    Nk = 800
    Nr = 500
    ps = 3
    sum_z = zeros(Nk,1)
    sum_zlog = zeros(Nk,1)
    sum_s = zeros(Nk,1)
    sum_slog = zeros(Nk,1)
    for i in 1:Nr
        Npool = Int(floor(10^(ps)))
        pool = zeros(Npool, 1)
        pool[:,1] .= 0.5

        pool_sample = zeros(Npool,1)

        z_list = zeros(Nk,1)

        s_list = zeros(Nk,1)

        z_log_list = zeros(Nk,1)

        s_log_list = zeros(Nk,1)

        Kup= [cos(theta) 0; 0 sin(theta)]
        Kdown = [sin(theta) 0; 0 cos(theta)]

        P2up = kron([1. 0.;0. 1.], [1 0; 0 0])
        P2down = kron([1 0;0 1],[0 0;0 1])

        h = Haar(2)
        for k in 1:Nk
            poolcount  =0
            while poolcount < Npool
                z1 = pool[rand(1:Npool),1]
                rho1 = diagm(0=>[z1,1-z1])

                z2 = pool[rand(1:Npool),1]
                rho2 = diagm(0=>[z2,1-z2])

                u1 = rand(h,2)
                u2 = rand(h,2)

                K1up = u1*Kup*u1'
                K1down = u1*Kdown*u1'

                K2up = u2*Kup*u2'
                K2down = u2*Kdown*u2'

                rho1p = K1up*rho1*K1up'
                rho2p = K2up*rho2*K2up'

                p1 = real(tr(rho1p+rho1p'))/2
                p2 = real(tr(rho2p+rho2p'))/2


                rho1p = (rho1p+rho1p')/(2*p1)


                rho2p = (rho2p+rho2p')/(2*p2)


                rho = kron(rho1p,rho2p)

                U = rand(h,4)

                rho_p = P2up*U*rho*U'*P2up'

                p = real(tr(rho_p+rho_p'))/2


                temp =(rho_p+rho_p')/2
                rho_f = [tr(temp[1:2,1:2]) tr(temp[1:2,3:4]);tr(temp[3:4,1:2]) tr(temp[3:4,3:4])]/(p)



                rho_f = (rho_f+rho_f')/2
                t = abs(tr(rho_f*rho_f))
                z = (1-t)/(1+sqrt(2*t-1))
                if abs(z)>0
                    poolcount = poolcount+1
                    pool_sample[poolcount,1] = abs(z)
                end
            end

            pool = copy(pool_sample)

            pool_sample[:,1] .= 0


            z_log_list[k,1] = mean(log.(pool),dims =1)[1]

            s_log_list[k,1] = std(log.(pool),dims = 1)[1]/sqrt(Npool)

            z_list[k,1] = mean(pool,dims =1)[1]

            s_list[k,1] = std(pool,dims = 1)[1]/sqrt(Npool)


        end

        sum_z += z_list
        sum_zlog += z_log_list
        sum_s += s_list.^2
        sum_slog += s_log_list.^2
    end
    return vec(sum_z)/Nr, sqrt.(vec(sum_s))/Nr,vec(sum_zlog)/Nr, sqrt.(vec(sum_slog))/Nr

end

@time z0,s0, z1,s1 = main();

19 posts - 6 participants