Khi thực hiện lập trình, có nhiều thao tác tính toán, các function thực hiện lặp đi lặp lại một công việc, các lập trình viên "già" thường sẽ viết thành các common-libs sau đó chia sẻ lại cho các "đàn em" trong team. Với các tiền bối có "tâm" thì các common-libs sẽ được tối ưu về hiệu năng tính toán hoặc giảm độ phức tạp thuật toán để thời gian xử lý nhanh, chính xác. Với những người còn lại thì ... hên xui :D
Trong ngôn ngữ lập trình Python, có một số "common-libs" được xây dựng hẳn thành build-in functions được tích hợp kèm với trình thông dịch Python, luôn sẵn sàng để "được" sử dụng ngay sau khi khởi tạo môi trường làm việc. Các lập trình viên Python hoàn toàn có thể yên tâm sử dụng các build-in functons này.
Build-in functions là gì?
Build-in functions là những hàm được cung cấp sẵn bởi ngôn ngữ Python, được hiểu là các function được đánh giá là "sử dụng nhiều" khi lập trình. Một số functions kinh điển như: sum
, bin
, max
,
my_list = [10, 20, 30, 40, 50]
# normal function
sum_basic = 0
for number in my_list:
sum_basic += number
# build-in function
sum_build_in = sum[my_list]
print["Normal function:", sum_basic]
print["Buil-in function:", sum_build_in]
0, my_list = [10, 20, 30, 40, 50]
# normal function
sum_basic = 0
for number in my_list:
sum_basic += number
# build-in function
sum_build_in = sum[my_list]
print["Normal function:", sum_basic]
print["Buil-in function:", sum_build_in]
1, ...Khi sử dụng build-in function, chúng ta sẽ rút ngắn được code và trong một số trường hợp sẽ đảm bảo hiệu năng tính toán [với bài toán số "cực lớn" có thể gây tràn memory thì code tay sẽ cho độ phức tạp tính toán tốt hơn]Một số functions kinh điển như:
sum
,
bin
, max
, my_list = [10, 20, 30, 40, 50]
# normal function
sum_basic = 0
for number in my_list:
sum_basic += number
# build-in function
sum_build_in = sum[my_list]
print["Normal function:", sum_basic]
print["Buil-in function:", sum_build_in]
0, my_list = [10, 20, 30, 40, 50]
# normal function
sum_basic = 0
for number in my_list:
sum_basic += number
# build-in function
sum_build_in = sum[my_list]
print["Normal function:", sum_basic]
print["Buil-in function:", sum_build_in]
1, ...Khi sử dụng build-in function, chúng ta sẽ rút ngắn được code và trong một số trường hợp sẽ đảm bảo hiệu năng tính toán [với bài toán số "cực lớn" có thể gây tràn memory thì code tay sẽ cho độ phức tạp tính toán tốt hơn]
Chúng ta có thể xem và tham khảo cách sử dụng các build-in functions bằng cách truy cập vào link từ trang chủ của Python: //docs.python.org/3/library/functions.html
Phần nội dụng dưới đây, tôi sẽ đưa ra một số ví dụ về các build-in function và việc đo đạc hiệu năng của các build-in function và cách làm thông thường.
Việc đo đạc sẽ sử dụng function sau:
import timeit
def benchmark[function, params, function_name]:
start = timeit.default_timer[]
function[params]
end = timeit.default_timer[]
print["{0} seconds for {1}".format[[end - start], function_name]]
1. Sum
Tính tổng của một danh sách các số truyền vào, kiểu dữ liệu vào là một iterable [list, set,...]: //docs.python.org/3/library/functions.html#sum
Ví dụ về cách sử dụng:
my_list = [10, 20, 30, 40, 50]
# normal function
sum_basic = 0
for number in my_list:
sum_basic += number
# build-in function
sum_build_in = sum[my_list]
print["Normal function:", sum_basic]
print["Buil-in function:", sum_build_in]
my_list = [10, 20, 30, 40, 50]
# normal function
sum_basic = 0
for number in my_list:
sum_basic += number
# build-in function
sum_build_in = sum[my_list]
print["Normal function:", sum_basic]
print["Buil-in function:", sum_build_in]
2my_list = [10, 20, 30, 40, 50]
# normal function
sum_basic = 0
for number in my_list:
sum_basic += number
# build-in function
sum_build_in = sum[my_list]
print["Normal function:", sum_basic]
print["Buil-in function:", sum_build_in]
3my_list = [10, 20, 30, 40, 50]
# normal function
sum_basic = 0
for number in my_list:
sum_basic += number
# build-in function
sum_build_in = sum[my_list]
print["Normal function:", sum_basic]
print["Buil-in function:", sum_build_in]
3Đo hiệu năng:
import random
import timeit
MAX_RANGE = 5000000 # 5 triệu nhé
def sum_normal_function[my_list]:
sum_basic = 0
for number in my_list:
sum_basic += number
return sum_basic
def sum_build_in_function[my_list]:
return sum[my_list]
def benchmark[function, params, function_name]:
start = timeit.default_timer[]
function[params]
end = timeit.default_timer[]
print["{0} seconds for {1}".format[[end - start], function_name]]
def do_benchmark[]:
my_list = [random.randint[0, MAX_RANGE] for _ in range[MAX_RANGE]]
benchmark[sum_normal_function, my_list, "sum_normal_function"]
benchmark[sum_build_in_function, my_list, "sum_build_in_function"]
do_benchmark[]
Kết quả lần 1:
my_list = [10, 20, 30, 40, 50]
# normal function
sum_basic = 0
for number in my_list:
sum_basic += number
# build-in function
sum_build_in = sum[my_list]
print["Normal function:", sum_basic]
print["Buil-in function:", sum_build_in]
4my_list = [10, 20, 30, 40, 50]
# normal function
sum_basic = 0
for number in my_list:
sum_basic += number
# build-in function
sum_build_in = sum[my_list]
print["Normal function:", sum_basic]
print["Buil-in function:", sum_build_in]
5my_list = [10, 20, 30, 40, 50]
# normal function
sum_basic = 0
for number in my_list:
sum_basic += number
# build-in function
sum_build_in = sum[my_list]
print["Normal function:", sum_basic]
print["Buil-in function:", sum_build_in]
4my_list = [10, 20, 30, 40, 50]
# normal function
sum_basic = 0
for number in my_list:
sum_basic += number
# build-in function
sum_build_in = sum[my_list]
print["Normal function:", sum_basic]
print["Buil-in function:", sum_build_in]
5Kết quả lần 2:
my_list = [10, 20, 30, 40, 50]
# normal function
sum_basic = 0
for number in my_list:
sum_basic += number
# build-in function
sum_build_in = sum[my_list]
print["Normal function:", sum_basic]
print["Buil-in function:", sum_build_in]
6my_list = [10, 20, 30, 40, 50]
# normal function
sum_basic = 0
for number in my_list:
sum_basic += number
# build-in function
sum_build_in = sum[my_list]
print["Normal function:", sum_basic]
print["Buil-in function:", sum_build_in]
7my_list = [10, 20, 30, 40, 50]
# normal function
sum_basic = 0
for number in my_list:
sum_basic += number
# build-in function
sum_build_in = sum[my_list]
print["Normal function:", sum_basic]
print["Buil-in function:", sum_build_in]
6my_list = [10, 20, 30, 40, 50]
# normal function
sum_basic = 0
for number in my_list:
sum_basic += number
# build-in function
sum_build_in = sum[my_list]
print["Normal function:", sum_basic]
print["Buil-in function:", sum_build_in]
7Kết quả lần 3:
my_list = [10, 20, 30, 40, 50]
# normal function
sum_basic = 0
for number in my_list:
sum_basic += number
# build-in function
sum_build_in = sum[my_list]
print["Normal function:", sum_basic]
print["Buil-in function:", sum_build_in]
8my_list = [10, 20, 30, 40, 50]
# normal function
sum_basic = 0
for number in my_list:
sum_basic += number
# build-in function
sum_build_in = sum[my_list]
print["Normal function:", sum_basic]
print["Buil-in function:", sum_build_in]
9my_list = [10, 20, 30, 40, 50]
# normal function
sum_basic = 0
for number in my_list:
sum_basic += number
# build-in function
sum_build_in = sum[my_list]
print["Normal function:", sum_basic]
print["Buil-in function:", sum_build_in]
8my_list = [10, 20, 30, 40, 50]
# normal function
sum_basic = 0
for number in my_list:
sum_basic += number
# build-in function
sum_build_in = sum[my_list]
print["Normal function:", sum_basic]
print["Buil-in function:", sum_build_in]
9So sánh
import random
import timeit
MAX_RANGE = 5000000 # 5 triệu nhé
def sum_normal_function[my_list]:
sum_basic = 0
for number in my_list:
sum_basic += number
return sum_basic
def sum_build_in_function[my_list]:
return sum[my_list]
def benchmark[function, params, function_name]:
start = timeit.default_timer[]
function[params]
end = timeit.default_timer[]
print["{0} seconds for {1}".format[[end - start], function_name]]
def do_benchmark[]:
my_list = [random.randint[0, MAX_RANGE] for _ in range[MAX_RANGE]]
benchmark[sum_normal_function, my_list, "sum_normal_function"]
benchmark[sum_build_in_function, my_list, "sum_build_in_function"]
do_benchmark[]
0 với import random
import timeit
MAX_RANGE = 5000000 # 5 triệu nhé
def sum_normal_function[my_list]:
sum_basic = 0
for number in my_list:
sum_basic += number
return sum_basic
def sum_build_in_function[my_list]:
return sum[my_list]
def benchmark[function, params, function_name]:
start = timeit.default_timer[]
function[params]
end = timeit.default_timer[]
print["{0} seconds for {1}".format[[end - start], function_name]]
def do_benchmark[]:
my_list = [random.randint[0, MAX_RANGE] for _ in range[MAX_RANGE]]
benchmark[sum_normal_function, my_list, "sum_normal_function"]
benchmark[sum_build_in_function, my_list, "sum_build_in_function"]
do_benchmark[]
1 thì ta thấy dùng build-in function đang nhanh hơn khoảng 45% so với cách làm thông thường.2. Len
Trả về độ dài của tham số truyền vào, các tham số truyền vào có thể là số, chuỗi, list, dict,... [//docs.python.org/3/library/functions.html#len]
my_string = "The Python interpreter has a number of functions and types built into it that are always available"
# normal function
length_basic = 0
for _ in my_string:
length_basic += 1
# build-in function
length_build_in = len[my_string]
print["Normal function:", length_basic]
print["Buil-in function:", length_build_in]
import random
import timeit
MAX_RANGE = 5000000 # 5 triệu nhé
def sum_normal_function[my_list]:
sum_basic = 0
for number in my_list:
sum_basic += number
return sum_basic
def sum_build_in_function[my_list]:
return sum[my_list]
def benchmark[function, params, function_name]:
start = timeit.default_timer[]
function[params]
end = timeit.default_timer[]
print["{0} seconds for {1}".format[[end - start], function_name]]
def do_benchmark[]:
my_list = [random.randint[0, MAX_RANGE] for _ in range[MAX_RANGE]]
benchmark[sum_normal_function, my_list, "sum_normal_function"]
benchmark[sum_build_in_function, my_list, "sum_build_in_function"]
do_benchmark[]
2import random
import timeit
MAX_RANGE = 5000000 # 5 triệu nhé
def sum_normal_function[my_list]:
sum_basic = 0
for number in my_list:
sum_basic += number
return sum_basic
def sum_build_in_function[my_list]:
return sum[my_list]
def benchmark[function, params, function_name]:
start = timeit.default_timer[]
function[params]
end = timeit.default_timer[]
print["{0} seconds for {1}".format[[end - start], function_name]]
def do_benchmark[]:
my_list = [random.randint[0, MAX_RANGE] for _ in range[MAX_RANGE]]
benchmark[sum_normal_function, my_list, "sum_normal_function"]
benchmark[sum_build_in_function, my_list, "sum_build_in_function"]
do_benchmark[]
3 import random
import timeit
MAX_RANGE = 5000000 # 5 triệu nhé
def sum_normal_function[my_list]:
sum_basic = 0
for number in my_list:
sum_basic += number
return sum_basic
def sum_build_in_function[my_list]:
return sum[my_list]
def benchmark[function, params, function_name]:
start = timeit.default_timer[]
function[params]
end = timeit.default_timer[]
print["{0} seconds for {1}".format[[end - start], function_name]]
def do_benchmark[]:
my_list = [random.randint[0, MAX_RANGE] for _ in range[MAX_RANGE]]
benchmark[sum_normal_function, my_list, "sum_normal_function"]
benchmark[sum_build_in_function, my_list, "sum_build_in_function"]
do_benchmark[]
3
Đây có lẽ là function được các developer dùng nhiều nhất vì tính tiện lợi và tốc độ trả về của nó. Tại sao thì chúng ta hãy cùng nhau đo benchmark nhé.
import random
import timeit
def length_normal_function[my_data]:
length_basic = 0
for _ in my_data:
length_basic += 1
return length_basic
def length_build_in_function[my_data]:
return len[my_data]
def benchmark[function, params, function_name]:
start = timeit.default_timer[]
function[params]
end = timeit.default_timer[]
print["{0} seconds for {1}".format[[end - start], function_name]]
def do_benchmark[]:
max_length = 5000000 # 5triệu
my_list = [random.randint[0, 100] for _ in range[max_length]]
benchmark[length_normal_function, my_list, "length_normal_function"]
benchmark[length_build_in_function, my_list, "length_build_in_function"]
do_benchmark[]
Lần chạy thứ nhất:
import random
import timeit
MAX_RANGE = 5000000 # 5 triệu nhé
def sum_normal_function[my_list]:
sum_basic = 0
for number in my_list:
sum_basic += number
return sum_basic
def sum_build_in_function[my_list]:
return sum[my_list]
def benchmark[function, params, function_name]:
start = timeit.default_timer[]
function[params]
end = timeit.default_timer[]
print["{0} seconds for {1}".format[[end - start], function_name]]
def do_benchmark[]:
my_list = [random.randint[0, MAX_RANGE] for _ in range[MAX_RANGE]]
benchmark[sum_normal_function, my_list, "sum_normal_function"]
benchmark[sum_build_in_function, my_list, "sum_build_in_function"]
do_benchmark[]
4import random
import timeit
MAX_RANGE = 5000000 # 5 triệu nhé
def sum_normal_function[my_list]:
sum_basic = 0
for number in my_list:
sum_basic += number
return sum_basic
def sum_build_in_function[my_list]:
return sum[my_list]
def benchmark[function, params, function_name]:
start = timeit.default_timer[]
function[params]
end = timeit.default_timer[]
print["{0} seconds for {1}".format[[end - start], function_name]]
def do_benchmark[]:
my_list = [random.randint[0, MAX_RANGE] for _ in range[MAX_RANGE]]
benchmark[sum_normal_function, my_list, "sum_normal_function"]
benchmark[sum_build_in_function, my_list, "sum_build_in_function"]
do_benchmark[]
5import random
import timeit
MAX_RANGE = 5000000 # 5 triệu nhé
def sum_normal_function[my_list]:
sum_basic = 0
for number in my_list:
sum_basic += number
return sum_basic
def sum_build_in_function[my_list]:
return sum[my_list]
def benchmark[function, params, function_name]:
start = timeit.default_timer[]
function[params]
end = timeit.default_timer[]
print["{0} seconds for {1}".format[[end - start], function_name]]
def do_benchmark[]:
my_list = [random.randint[0, MAX_RANGE] for _ in range[MAX_RANGE]]
benchmark[sum_normal_function, my_list, "sum_normal_function"]
benchmark[sum_build_in_function, my_list, "sum_build_in_function"]
do_benchmark[]
4import random
import timeit
MAX_RANGE = 5000000 # 5 triệu nhé
def sum_normal_function[my_list]:
sum_basic = 0
for number in my_list:
sum_basic += number
return sum_basic
def sum_build_in_function[my_list]:
return sum[my_list]
def benchmark[function, params, function_name]:
start = timeit.default_timer[]
function[params]
end = timeit.default_timer[]
print["{0} seconds for {1}".format[[end - start], function_name]]
def do_benchmark[]:
my_list = [random.randint[0, MAX_RANGE] for _ in range[MAX_RANGE]]
benchmark[sum_normal_function, my_list, "sum_normal_function"]
benchmark[sum_build_in_function, my_list, "sum_build_in_function"]
do_benchmark[]
5Lần chạy thứ hai:
import random
import timeit
MAX_RANGE = 5000000 # 5 triệu nhé
def sum_normal_function[my_list]:
sum_basic = 0
for number in my_list:
sum_basic += number
return sum_basic
def sum_build_in_function[my_list]:
return sum[my_list]
def benchmark[function, params, function_name]:
start = timeit.default_timer[]
function[params]
end = timeit.default_timer[]
print["{0} seconds for {1}".format[[end - start], function_name]]
def do_benchmark[]:
my_list = [random.randint[0, MAX_RANGE] for _ in range[MAX_RANGE]]
benchmark[sum_normal_function, my_list, "sum_normal_function"]
benchmark[sum_build_in_function, my_list, "sum_build_in_function"]
do_benchmark[]
6import random
import timeit
MAX_RANGE = 5000000 # 5 triệu nhé
def sum_normal_function[my_list]:
sum_basic = 0
for number in my_list:
sum_basic += number
return sum_basic
def sum_build_in_function[my_list]:
return sum[my_list]
def benchmark[function, params, function_name]:
start = timeit.default_timer[]
function[params]
end = timeit.default_timer[]
print["{0} seconds for {1}".format[[end - start], function_name]]
def do_benchmark[]:
my_list = [random.randint[0, MAX_RANGE] for _ in range[MAX_RANGE]]
benchmark[sum_normal_function, my_list, "sum_normal_function"]
benchmark[sum_build_in_function, my_list, "sum_build_in_function"]
do_benchmark[]
7import random
import timeit
MAX_RANGE = 5000000 # 5 triệu nhé
def sum_normal_function[my_list]:
sum_basic = 0
for number in my_list:
sum_basic += number
return sum_basic
def sum_build_in_function[my_list]:
return sum[my_list]
def benchmark[function, params, function_name]:
start = timeit.default_timer[]
function[params]
end = timeit.default_timer[]
print["{0} seconds for {1}".format[[end - start], function_name]]
def do_benchmark[]:
my_list = [random.randint[0, MAX_RANGE] for _ in range[MAX_RANGE]]
benchmark[sum_normal_function, my_list, "sum_normal_function"]
benchmark[sum_build_in_function, my_list, "sum_build_in_function"]
do_benchmark[]
6import random
import timeit
MAX_RANGE = 5000000 # 5 triệu nhé
def sum_normal_function[my_list]:
sum_basic = 0
for number in my_list:
sum_basic += number
return sum_basic
def sum_build_in_function[my_list]:
return sum[my_list]
def benchmark[function, params, function_name]:
start = timeit.default_timer[]
function[params]
end = timeit.default_timer[]
print["{0} seconds for {1}".format[[end - start], function_name]]
def do_benchmark[]:
my_list = [random.randint[0, MAX_RANGE] for _ in range[MAX_RANGE]]
benchmark[sum_normal_function, my_list, "sum_normal_function"]
benchmark[sum_build_in_function, my_list, "sum_build_in_function"]
do_benchmark[]
7Lần chạy thứ ba:
import random
import timeit
MAX_RANGE = 5000000 # 5 triệu nhé
def sum_normal_function[my_list]:
sum_basic = 0
for number in my_list:
sum_basic += number
return sum_basic
def sum_build_in_function[my_list]:
return sum[my_list]
def benchmark[function, params, function_name]:
start = timeit.default_timer[]
function[params]
end = timeit.default_timer[]
print["{0} seconds for {1}".format[[end - start], function_name]]
def do_benchmark[]:
my_list = [random.randint[0, MAX_RANGE] for _ in range[MAX_RANGE]]
benchmark[sum_normal_function, my_list, "sum_normal_function"]
benchmark[sum_build_in_function, my_list, "sum_build_in_function"]
do_benchmark[]
8import random
import timeit
MAX_RANGE = 5000000 # 5 triệu nhé
def sum_normal_function[my_list]:
sum_basic = 0
for number in my_list:
sum_basic += number
return sum_basic
def sum_build_in_function[my_list]:
return sum[my_list]
def benchmark[function, params, function_name]:
start = timeit.default_timer[]
function[params]
end = timeit.default_timer[]
print["{0} seconds for {1}".format[[end - start], function_name]]
def do_benchmark[]:
my_list = [random.randint[0, MAX_RANGE] for _ in range[MAX_RANGE]]
benchmark[sum_normal_function, my_list, "sum_normal_function"]
benchmark[sum_build_in_function, my_list, "sum_build_in_function"]
do_benchmark[]
9import random
import timeit
MAX_RANGE = 5000000 # 5 triệu nhé
def sum_normal_function[my_list]:
sum_basic = 0
for number in my_list:
sum_basic += number
return sum_basic
def sum_build_in_function[my_list]:
return sum[my_list]
def benchmark[function, params, function_name]:
start = timeit.default_timer[]
function[params]
end = timeit.default_timer[]
print["{0} seconds for {1}".format[[end - start], function_name]]
def do_benchmark[]:
my_list = [random.randint[0, MAX_RANGE] for _ in range[MAX_RANGE]]
benchmark[sum_normal_function, my_list, "sum_normal_function"]
benchmark[sum_build_in_function, my_list, "sum_build_in_function"]
do_benchmark[]
8import random
import timeit
MAX_RANGE = 5000000 # 5 triệu nhé
def sum_normal_function[my_list]:
sum_basic = 0
for number in my_list:
sum_basic += number
return sum_basic
def sum_build_in_function[my_list]:
return sum[my_list]
def benchmark[function, params, function_name]:
start = timeit.default_timer[]
function[params]
end = timeit.default_timer[]
print["{0} seconds for {1}".format[[end - start], function_name]]
def do_benchmark[]:
my_list = [random.randint[0, MAX_RANGE] for _ in range[MAX_RANGE]]
benchmark[sum_normal_function, my_list, "sum_normal_function"]
benchmark[sum_build_in_function, my_list, "sum_build_in_function"]
do_benchmark[]
9Với kết quả
my_string = "The Python interpreter has a number of functions and types built into it that are always available"
# normal function
length_basic = 0
for _ in my_string:
length_basic += 1
# build-in function
length_build_in = len[my_string]
print["Normal function:", length_basic]
print["Buil-in function:", length_build_in]
0 cho việc sử dụng build-in function thì chả có lý do gì mà chúng ta lại không dùng function sẵn có này nhỉ.3. Eval
Đây là một build-in function độc đáo mà Python cung cấp cho các lập trình viên. Đầu vào của function này là một chuỗi sau đó sẽ thực hiện tìm kiếm các toán tử và toán hạng sau đó thực hiện tính toán và trả về kết quả. [//docs.python.org/3/library/functions.html#eval]
expression = "number + number + 100 - 35 + 5 * 80"
print["{}: type of {}".format[expression, type[expression]]]
number = 10
eval_result = eval[expression]
print["{} = {}: type of {}".format[expression, eval_result, type[eval_result]]]
number + number + 100 - 35 + 5 * 80: type of
number + number + 100 - 35 + 5 * 80 = 485: type of
Bình thường với các ngôn ngữ lập trình khác, để thực hiện việc chuyển biểu thức thành kết quả tính toán ... là cả một vấn đề khó khăn nhưng với build-in function eval của Python mọi thứ đã đơn giản hơn.
Kết luận
Ngoài các function phía trên, còn kha khá các function khác và vô số lợi ích không tưởng mà chúng mang lại cho các lập trình viên Python. Tuy nhiên, khi làm việc với build-in function, các bạn cần chú ý một chút chút về việc đặt tên các function, name như tôi đã đưa ra ở bài viết: Đặt trùng tên biến và function với keyword.Cảm ơn các bạn đã đọc bài viết của tôi.
Cảm ơn các bạn đã đọc bài viết của tôi.