2011-07-11 29 views
5

Tôi đang nhìn vào một số mã NumPy Python, trong đó có chứa đường nhưLợi thế của việc sử dụng "x * = -1." trên "x * = -1"?

a = 1. # later on, `a` is multiplied by other floats 
x *= -1. 

(Từ những gì tôi hy vọng hiểu đúng, 1. tương đương với 1.0).

Có lý do nào để thực hiện điều này qua a = 1x *= -1 không? Tôi có thể hiểu nó nếu tôi sẽ chia ax bởi một số nguyên sau này, để tôi không phải lo lắng về việc quên bỏ chúng vào một phao (giả sử tôi muốn một phao trả về là kết quả của phân chia), nhưng có lý do nào khác không?

Ví dụ: nếu tôi biết rằng a sẽ kết thúc dưới dạng phao, có tốt hơn vì lý do hiệu suất để chỉ khởi tạo nó dưới dạng phao từ đầu không? Hay đây chỉ là sự rõ ràng (để làm rõ rằng ax đều có nghĩa là nổi)?

+1

Có thể cho cả sự rõ ràng và tránh lỗi. –

Trả lời

6

Khá rõ ràng.

Trong khi nhân một phao bằng số nguyên có thể phải chịu một hiệu suất nhỏ (để chuyển đổi số nguyên thành phao), điều này phụ thuộc vào trình biên dịch và cũng không nên là một hình phạt đủ lớn để lo lắng (trừ khi bạn đang làm nhiều hoạt động như vậy).

Tuy nhiên, nó chắc chắn ghi điểm cho sự rõ ràng. Cuối cùng, bạn thực sự đang nhân một số dấu phẩy động với một số dấu phẩy động, và không có lý do gì để che giấu sự kiện này. Nếu ax có nghĩa là giá trị nổi, hãy để chúng là giá trị nổi.

1

Bất kỳ trình biên dịch tự tôn trọng nào cũng sẽ quảng bá các hằng số cho loại thích hợp. Sự khác biệt chỉ là mỹ phẩm.

+2

Nhưng trình biên dịch của Python không cố gắng quá nhiều để làm bất cứ điều gì ưa thích. Và ngay cả trong một vài ngôn ngữ có trình biên dịch thông minh, trình biên dịch không thể thay đổi kiểu của biểu thức theo ý thích của nó, đặc biệt nếu nó dẫn đến ngữ nghĩa khác nhau (như câu trả lời của bạn dường như ngụ ý) ngôn ngữ bắt buộc nó, đó là một vấn đề hoàn toàn khác. – delnan

+0

Infact Blindy không nói rằng trình biên dịch thay đổi kiểu biểu thức mà đơn giản là nó đẩy mạnh các hằng số. Tôi sẽ ngạc nhiên nếu, trong Python như trong bất kỳ ngôn ngữ khác, chuyển đổi như vậy liên quan đến thời gian chạy! – Mapio

+0

@eryksyn: bạn đã đúng! quá nhiều năm của lập trình C (và giảng dạy) khiến tôi quên đi thực tế là nó làm cho không phải senso để nói về (tĩnh/biên dịch-thời gian) loại vars trong Python… – Mapio

0

Không có sự khác biệt về đầu ra mà tôi có thể phát hiện.

>>> float(1.*-5.*0.*-1.).hex() 
'0x0.0p+0' 
>>> float(1.*-5.*0.*-1).hex() 
'0x0.0p+0' 
>>> float(1.*5.*0.*-1.).hex() 
'-0x0.0p+0' 
>>> float(1.*5.*0.*-1).hex() 
'-0x0.0p+0' 
>>> 
Các vấn đề liên quan