Pull to refresh

Comments 4

Может чуть не по теме. Но интересна, какие паттерн матчинги в WL по производительности выигрывают:

Сопоставление DownValues по строке

Something["uid"][args_] := Print[args];

(* где-то в коде, вызывается ... *)
Something[providedUid][data]

Или по символам

$GeneratedSymbol`$337[args_] := Print[args];

(* где-то в коде, вызывается ... *)
$GeneratedSymbol`$337[data]

Пока не запуская тесты я могу предположить, что второй вариант быстрее и в среднем и асимптотически, так как просто в нем будет меньше определений, а значит потребуется перебрать меньше шаблонов. Плюс первый вариант - это SubValues. Попробую измерить время и вернусь!

Ну, так и получилось на самом деле. Причем разница довольно заметная:

uuids = Table[
	With[{uuid = CreateUUID[]}, 
		func[uuid][args_] := args; 
		uuid
	], 
	{1000}
]; 

symbols = Table[
	With[{symbol = Unique["symbol`$"]}, 
		symbol[args_] := args;
		symbol 
	], 
	{1000}
];

With[{uuid = uuids[[1]]}, RepeatedTiming[func[uuid][1]]]
With[{f = symbols[[1]]}, RepeatedTiming[f[1]]]
Sign up to leave a comment.

Articles