vấn đề đầu tiênHai vấn đề hiệu quả lạ trong Mathematica
Tôi đã timed phải mất bao lâu để tính toán những điều khoản sau đây (trong đó V [x] là một thời gian chuyên sâu gọi hàm):
Alice = Table[V[i],{i,1,300},{1000}];
Bob = Table[Table[V[i],{i,1,300}],{1000}]^tr;
Chris_pre = Table[V[i],{i,1,300}];
Chris = Table[Chris_pre,{1000}]^tr;
Alice , Bob và Chris là các ma trận giống hệt nhau tính 3 cách hơi khác nhau. Tôi thấy rằng Chris được tính nhanh gấp 1000 lần so với Alice và Bob. Không có gì ngạc nhiên khi Alice được tính chậm hơn 1000 lần bởi vì, ngây thơ, hàm V phải được gọi là 1000 lần nhiều hơn khi Chris được tính toán. Nhưng điều đáng ngạc nhiên là Bob chậm quá, vì anh ta được tính giống hệt nhau đối với Chris ngoại trừ việc Chris lưu trữ bước trung gian Chris_pre.
Tại sao Bob đánh giá quá chậm?
THỨ HAI VẤN ĐỀ
Giả sử tôi muốn biên dịch một hàm trong Mathematica có dạng
f(x)=x+y
nơi "y" là một hằng số cố định tại thời gian biên dịch (nhưng mà tôi không muốn trực tiếp thay thế trong mã bằng số của nó bởi vì tôi muốn có thể dễ dàng thay đổi nó). Nếu giá trị thực tế của y là y = 7.3 và tôi xác định
f1=Compile[{x},x+y]
f2=Compile[{x},x+7.3]
thì f1 chạy chậm hơn 50% so với f2. Làm thế nào để làm cho Mathematica thay thế "y" bằng "7.3" khi f1 được biên dịch, do đó f1 chạy nhanh như f2?
EDIT:
Tôi tìm thấy một workaround xấu xí cho vấn đề thứ hai:
f1=ReleaseHold[Hold[Compile[{x},x+z]]/.{z->y}]
Có phải là một cách tốt hơn ...
Wow, cảm ơn rất nhiều! Điều này thật đúng với gì mà tôi đã tìm kiếm. (Và tôi sẽ đảm bảo đăng các sự cố như thế này một cách riêng biệt trong tương lai.) –
Sử dụng 'With' có lẽ là cách an toàn nhất để giải quyết vấn đề hai, vì nó thực sự thay thế từ vựng trước bất kỳ đánh giá nào của cơ thể. –
@Michael Pilat: Đồng ý. Tôi đề nghị Đánh giá theo tinh thần của một cách tiếp cận nhanh chóng và bẩn nếu bạn đã xác định 'y', nhưng biến phụ tạm thời chắc chắn an toàn hơn. – Cascabel