自学一直有一个困扰(因为教程里不太会提及这种问题)
比如一些简单的函数或方法,如 len()
、isdigit()
多次使用的情况下
string = 'something'
if len(string) == 1:
pass
elif len(string) == 2:
pass
是否需要定义一个临时的变量
string = 'something'
length = len(string)
if len(length) == 1:
pass
elif len(length) == 2:
pass
这样变量多了一个,但是函数少计算一次
哪一种益处更大呢?
-是所有此类情况都用临时变量呢?
-还是具体函数具体分析,简单的不需要临时变量?
从资源合理利用的角度,怎么权衡这两种方案
Mari kita bercakap tentang kesimpulannya dahulu:
Izinkan saya menjawab soalan anda secara ringkas dari dua aspek
Pertama sekali, apabila kecekapan bukan teras utama program semasa, usaha untuk kebolehbacaan harus menjadi prinsip tertinggi
Bagaimana nak sebut?
Sesetengah program dan isu pemprosesan kod bukanlah isu yang mengejar kelajuan Contohnya, berbanding dengan program pengebilan yang mudah berbanding dengan pengiraan saintifik, ia tidak begitu bermakna untuk mengejar pengoptimuman kelajuan pelaksanaan secara khusus usaha Untuk program yang cekap, ia tidak semestinya bermakna bahawa kod yang anda fokuskan pada masa ini adalah kunci kepada kecekapan (profil diperlukan untuk benar-benar menentukan, dan pengoptimuman pramatang bukanlah idea yang baik). Intinya, jika tiada masalah prestasi dan anda telah menentukan bahawa ia disebabkan oleh segmen kod ini, jika tidak, tidak perlu terlalu mempertimbangkan sumber atau prestasi Lebih-lebih lagi sekarang ruang dan kelajuan pengkomputeran mesin telah bertambah baik , sesetengah panggilan fungsi tidak ada sama sekali , jika tidak, oop dan beberapa teknik abstrak tidak akan tersedia lagi.
Jadi mengejar kebolehbacaan secara amnya adalah matlamat yang lebih baik Sudah tentu, bahagian ini bergantung pada situasi Sebagai contoh, buku Refactoring menyebut kaedah Gantikan Suhu dengan Pertanyaan, kerana pembolehubah serantau Mungkin membuat. kod sukar untuk diekstrak. Tetapi itu tidak selalu berlaku. Kadangkala formula Pertanyaan yang terlalu panjang boleh menyukarkan kod untuk dibaca.
Bahagian kedua boleh menganalisis kecekapan Dalam kes
len
, saya akan memilih untuk tidak menentukan pembolehubah lain, kerana Python mempunyai struktur data terbina dalam, dan fungsilen
akan mengekstraknya secara langsung daripada sepadan C -Atribut panjang data yang dikembalikan dalam Objek, jadi bahagian ini sangat pantas Apa yang saya maksudkan ialah Python itu sendiri menyimpan maklumat panjang untuk data terbina dalam sendiri Menggunakanlen
tidak akan menyebabkan pengiraan tambahan adalah panggilan berlatarkan, jadi tidak perlu mempertimbangkan isu kecekapan sama sekali.Selain itu,
len
sangat mudah dibaca dan panjang fungsinya sangat pendek. Ia tidak perlu untuk menentukan pembolehubah baharu.P.S. Jika pemahaman saya salah, sila betulkan saya, terima kasih
Daripada pertimbangan prestasi, keadaan ini memang memerlukan pembolehubah sementara Adalah disyorkan untuk membangunkan tabiat yang baik Tidak ada salahnya menggunakan pembolehubah sementara lebih banyak
Pertama sekali, betulkan atur cara dalam versi kedua,
len()
pembolehubah sementara juga mesti diberi nama yang bermakna.Saya tidak tahu jika anda mempunyai sebarang konsep kerumitan masa Kerumitan masa bagi sesetengah algoritma ialah O(N) Dalam erti kata lain, jika rentetan anda mempunyai n elemen, program anda mesti melalui n langkah matlamatnya, jika anda perlu menggunakan algoritma ini m kali pada masa hadapan, maka kerumitan masa program anda akan mengambil sekurang-kurangnya n*m langkah untuk diselesaikan.
Jika anda menggunakan pembolehubah sementara untuk merekodkan algoritma ini, maka kerumitan masa mencari nilai hanya akan O(1) Maksudnya, jumlah kerumitan program anda dikurangkan daripada O(n*m ) kepada O(n m), jika
n <= m
, kerumitan masa program anda dikurangkan daripada O(N^2) asal kepada O(N).Saya tidak bersetuju dengan idea menggunakan lebih banyak pembolehubah sementara Jika kekerapan pembolehubah sementara dalam program adalah
Adakah kerumitan masa program telah dikurangkan dengan ketara?
Adakah ia memudahkan orang lain memahami niat anda?
Bolehkah kod kelihatan lebih ringkas?
Masalah ini secara amnya disesuaikan dengan keadaan tempatan Jika terdapat hanya dua pertimbangan, tidak perlu untuk menentukan pembolehubah Lagipun, sukar untuk mengekalkan terlalu banyak pembolehubah. Setakat panjang anda, jika terdapat berbilang pertimbangan, anda boleh menggunakan kes suis dan terus lulus kaedah len() sebagai parameter, dan meletakkan pilihan yang paling mungkin dahulu. Saya tidak pernah belajar Python, tetapi saya rasa perlu ada kaedah suis case. Daripada pengalaman saya, tentukan pembolehubah sementara sesedikit mungkin. Dari masa ke masa, pengurusan pembolehubah akan menjadi sukar. Sudah tentu, pembolehubah diperlukan di beberapa tempat, seperti dalam gelung for Menentukan pembolehubah sementara untuk menyimpan panjang tatasusunan akan meningkatkan prestasi. Pendek kata, semuanya harus berdasarkan realiti Apabila pembolehubah sementara boleh meningkatkan kebolehbacaan dan kebolehselenggaraan kod semasa, ia diperlukan. Jika tidak, ia tidak ditakrifkan.