我不這麼認爲,但我很樂意被證明是錯誤的。
您應該研究其他優化正在運行的代碼的方法。
如果你的數據是固定的,你可以計算一次距離,保存(可能相當大)的距離矩陣,並要求分離度。
如果你的分析確實不要求所有x
頂點之間的距離,你應該考慮通過縮短t_ids$ID_from[x]
做的優化您的代碼。只獲得你需要的距離。不過,我懷疑你已經這麼做了。
distances()
實際計算相當快。在10'000節點(相當於4,99 * 10^6無方向的距離),我的蹩腳機器在幾秒鐘內就可以獲得完整的700MB大距離矩陣。
我首先想到了可以在distances()
中選擇的不同算法,但現在我懷疑他們會幫助你。我對不同的算法進行了速度測試,看是否可以向你推薦它們中的任何一個,但它們似乎都以相同的速度運行(結果與使用將使用的自動算法進行計算的時間有關係在上面的代碼中):
sample automatic unweighted dijkstra bellman-ford johnson
1 10 1 0.9416667 0.9750000 1.0750000 1.0833333
2 100 1 0.9427083 0.9062500 0.8906250 0.8958333
3 1000 1 0.9965636 0.9656357 0.9977090 0.9873998
4 5000 1 0.9674200 0.9947269 0.9691149 1.0007533
5 10000 1 1.0070885 0.9938136 0.9974223 0.9953602
我覺得沒有什麼可以從此結束,但它的上鄂爾多斯 - 萊利模式運行。您的網絡結構有可能偏好一種算法而不是另一種算法,但他們仍然可以在您希望的性能提升附近找到任何地方。
的代碼是在這裏:
# igrpah
library(igraph)
# setup:
samplesizes <- c(10, 100, 1000, 5000, 10000)
reps <- c(100, 100, 15, 3, 1)
algorithms = c("automatic", "unweighted", "dijkstra", "bellman-ford", "johnson")
df <- as.data.frame(matrix(ncol=length(algorithms), nrow=0), stringsAsFactors = FALSE)
names(df) <- algorithms
# any random graph
g <- erdos.renyi.game(10000, 10000, "gnm")
# These are the different algorithms used by distances:
m.auto <- distances(g, v=V(g), to=V(g), weights=NA, algorithm="automatic")
m.unwg <- distances(g, v=V(g), to=V(g), weights=NA, algorithm="unweighted")
m.dijk <- distances(g, v=V(g), to=V(g), weights=NA, algorithm="dijkstra")
m.belm <- distances(g, v=V(g), to=V(g), weights=NA, algorithm="bellman-ford")
m.john <- distances(g, v=V(g), to=V(g), weights=NA, algorithm="johnson")
# They produce the same result:
sum(m.auto == m.unwg & m.auto == m.dijk & m.auto == m.belm & m.auto == m.john) == length(m.auto)
# Use this function will be used to test the speed of distances() run using different algorithms
test_distances <- function(alg){
m.auto <- distances(g, v=V(g), to=V(g), weights=NA, algorithm=alg)
(TRUE)
}
# Build testresults
for(i.sample in 1:length(samplesizes)){
# Create a random network to test
g <- erdos.renyi.game(samplesizes[i.sample], (samplesizes[i.sample]*1.5), type = "gnm", directed = FALSE, loops = FALSE)
i.rep <- reps[i.sample]
for(i.alg in 1:length(algorithms)){
df[i.sample,i.alg] <- system.time(replicate(i.rep, test_distances(algorithms[i.alg])))[['elapsed']]
}
}
# Normalize benchmark results
dfn <- df
dfn[,1:length(df[,])] <- df[,1:length(df[,])]/df[,1]
dfn$sample <- samplesizes
dfn <- dfn[,c(6,1:5)]
dfn