Hướng dẫn if not a and not b python - nếu không phải a và không phải b python

Tôi chỉ nhận thấy câu hỏi này thông qua meta của bạn Câu hỏi: Có phù hợp để chia sẻ kết quả nghiên cứu của tôi đối với việc giải quyết các câu hỏi nhỏ của riêng tôi không ?. Như bạn đã đề cập trong câu hỏi đó (và một trong những thẻ trên câu hỏi này cho biết), loại điều này rơi vào danh mục tối ưu hóa vi mô. Lý tưởng nhất, người ta không cần phải lo lắng về những khác biệt hiệu suất nhỏ như vậy, và như Knuth nói, tối ưu hóa sớm là gốc rễ của mọi điều ác. Nhưng tôi đoán thật thú vị và hướng dẫn để điều tra những vấn đề như vậy, vì nó có thể mang lại cho bạn cảm giác tốt hơn về cách thức hoạt động của Python "dưới mui xe".

Nhận xét của Mephy đã thôi thúc tôi xem sự khác biệt về thời gian là gì đối với các phiên bản không có chức năng của bạn. Kết quả rất thú vị, IMHO. Tôi cũng đã có cơ hội để hợp lý hóa quy trình thử nghiệm của bạn.

#!/usr/bin/env python

''' Do timeit tests on various implementations of NAND

    NAND returns True if either argument is falsey, else False.
    From https://stackoverflow.com/q/29551438/4014959
    Written by PM 2Ring 2015.04.09
'''

from timeit import Timer
import dis

def and_chk(a, b):
    return not (a and b)

def and_chk_if(a, b):
    if not (a and b):
        return True
    else:
        return False

def not_or_chk(a, b):
    return not a or not b

def not_or_chk_if(a, b):
    if not a or not b:
        return True
    else:
        return False


#All the functions
funcs = (
    and_chk,
    and_chk_if,
    not_or_chk,
    not_or_chk_if,
)

#Argument tuples to test the functions with
bools = (0, 1)
bool_tups = [(u, v) for u in bools for v in bools]


def show_dis():
    ''' Show the disassembly for each function '''
    print 'Disassembly'
    for func in funcs:
        fname = func.func_name
        print '\n%s' % fname
        dis.dis(func)
    print


def verify():
    ''' Verify that the functions actually perform as intended '''
    print 'Verifying...'
    for func in funcs:
        fname = func.func_name
        print '\n%s' % fname
        for args in bool_tups:
            print args, func(*args)
    print


def time_test(loops, reps):
    ''' Print timing stats for all the functions '''
    print 'Timing tests\nLoops = %d, Repetitions = %d' % (loops, reps)

    for func in funcs:
        fname = func.func_name
        print '\n%s' % fname
        setup = 'from __main__ import %s' % fname
        for args in bool_tups:
            t = Timer('%s%s' % (fname, args), setup)
            r = t.repeat(reps, loops)
            r.sort()
            print args, r


show_dis()
verify()
time_test(loops=520000, reps=3)

đầu ra

Disassembly

and_chk
 13           0 LOAD_FAST                0 (a)
              3 JUMP_IF_FALSE            4 (to 10)
              6 POP_TOP             
              7 LOAD_FAST                1 (b)
        >>   10 UNARY_NOT           
             11 RETURN_VALUE        

and_chk_if
 16           0 LOAD_FAST                0 (a)
              3 JUMP_IF_FALSE            4 (to 10)
              6 POP_TOP             
              7 LOAD_FAST                1 (b)
        >>   10 JUMP_IF_TRUE             5 (to 18)
             13 POP_TOP             

 17          14 LOAD_GLOBAL              0 (True)
             17 RETURN_VALUE        
        >>   18 POP_TOP             

 19          19 LOAD_GLOBAL              1 (False)
             22 RETURN_VALUE        
             23 LOAD_CONST               0 (None)
             26 RETURN_VALUE        

not_or_chk
 22           0 LOAD_FAST                0 (a)
              3 UNARY_NOT           
              4 JUMP_IF_TRUE             5 (to 12)
              7 POP_TOP             
              8 LOAD_FAST                1 (b)
             11 UNARY_NOT           
        >>   12 RETURN_VALUE        

not_or_chk_if
 25           0 LOAD_FAST                0 (a)
              3 UNARY_NOT           
              4 JUMP_IF_TRUE             8 (to 15)
              7 POP_TOP             
              8 LOAD_FAST                1 (b)
             11 UNARY_NOT           
             12 JUMP_IF_FALSE            5 (to 20)
        >>   15 POP_TOP             

 26          16 LOAD_GLOBAL              0 (True)
             19 RETURN_VALUE        
        >>   20 POP_TOP             

 28          21 LOAD_GLOBAL              1 (False)
             24 RETURN_VALUE        
             25 LOAD_CONST               0 (None)
             28 RETURN_VALUE        

Verifying...

and_chk
(0, 0) True
(0, 1) True
(1, 0) True
(1, 1) False

and_chk_if
(0, 0) True
(0, 1) True
(1, 0) True
(1, 1) False

not_or_chk
(0, 0) True
(0, 1) True
(1, 0) True
(1, 1) False

not_or_chk_if
(0, 0) True
(0, 1) True
(1, 0) True
(1, 1) False

Timing tests
Loops = 520000, Repetitions = 3

and_chk
(0, 0) [0.36773014068603516, 0.37793493270874023, 0.38387489318847656]
(0, 1) [0.36292791366577148, 0.37119913101196289, 0.37146902084350586]
(1, 0) [0.38673520088195801, 0.39340090751647949, 0.39670205116271973]
(1, 1) [0.38938498497009277, 0.39505791664123535, 0.40034103393554688]

and_chk_if
(0, 0) [0.4021449089050293, 0.40345501899719238, 0.41558098793029785]
(0, 1) [0.40686416625976562, 0.41213202476501465, 0.44800615310668945]
(1, 0) [0.4281308650970459, 0.42916202545166016, 0.43681907653808594]
(1, 1) [0.46246123313903809, 0.46759700775146484, 0.47544980049133301]

not_or_chk
(0, 0) [0.35435700416564941, 0.36368083953857422, 0.36867713928222656]
(0, 1) [0.35602092742919922, 0.35732793807983398, 0.36237406730651855]
(1, 0) [0.39550518989562988, 0.40660715103149414, 0.40977287292480469]
(1, 1) [0.4060060977935791, 0.4112389087677002, 0.41296815872192383]

not_or_chk_if
(0, 0) [0.4308779239654541, 0.44109201431274414, 0.45827698707580566]
(0, 1) [0.43600606918334961, 0.4370419979095459, 0.47623395919799805]
(1, 0) [0.48452401161193848, 0.48769593238830566, 0.49147915840148926]
(1, 1) [0.53107500076293945, 0.54048299789428711, 0.55434417724609375]

Những thời gian này được thực hiện bằng Python 2.6.6 trên Pentium 4 2GHz (lõi đơn 32 bit) chạy MEPIS 11 (một bản phân phối gia đình Debian Linux).

Bạn sẽ lưu ý rằng tôi đã tránh sử dụng chiến lược next(tups) của mình để có được các đối số cho mỗi cuộc gọi chức năng và thay vào đó tôi sẽ chuyển trực tiếp ARGS, dưới dạng hằng số. Thời gian thực hiện next(tups) nên khá ổn định, nhưng tốt nhất là loại bỏ các chi phí như vậy, khi thực tế, để các phép đo thời gian được báo cáo phản ánh chính xác hơn hiệu suất của mã mà chúng tôi thực sự quan tâm.

Ngoài ra, thông thường để thực hiện một số lần lặp lại của vòng lặp thời gian và lấy giá trị tối thiểu; FWIW, tôi thường làm 3 đến 5 reps. Từ các tài liệu thời gian:

Ghi chú

Nó rất hấp dẫn để tính toán độ lệch trung bình và độ lệch chuẩn so với vectơ kết quả và báo cáo những điều này. Tuy nhiên, điều này không hữu ích lắm. Trong trường hợp điển hình, giá trị thấp nhất cho giới hạn thấp hơn về tốc độ máy của bạn có thể chạy đoạn mã đã cho; Các giá trị cao hơn trong vectơ kết quả thường không phải do sự thay đổi của tốc độ Python, mà bởi các quá trình khác can thiệp vào độ chính xác về thời gian của bạn. Vì vậy, Min () của kết quả có lẽ là con số duy nhất bạn nên quan tâm. Sau đó, bạn nên nhìn vào toàn bộ vectơ và áp dụng ý thức chung thay vì thống kê.

Bài đăng meta của bạn nói rằng bạn muốn thực hiện và báo cáo về các thí nghiệm tối ưu hóa vi mô khác, vì vậy bạn có thể quan tâm đến việc xem xét một số mã tôi đã đăng một vài tháng trước đây thực hiện các bài kiểm tra thời gian về các triển khai khác nhau của chức năng giai thừa.

Làm thế nào để bạn kiểm tra xem một cái gì đó không có trong Python?

Không phải trong toán tử trong nhà điều hành - toán tử này được sử dụng để kiểm tra xem một phần tử không có trong danh sách được truyền hay không.Trả về true nếu phần tử không có trong danh sách khác trả về sai. − This operator is used to check whether an element is not present in the passed list or not. Returns true if the element is not present in the list otherwise returns false.

Làm thế nào để bạn phủ nhận một điều kiện trong Python?

Phương pháp 1: Sử dụng toán tử ~ ~ Đây là toán tử không phải là toán tử không thể sử dụng để trả về sự phủ định của toán hạng.Using the “~” operator This is the Bitwise NOT operator which can be used to return the negation of the operand.

Làm thế nào để bạn sử dụng chức năng không trong Python?

Để sử dụng not_ (), trước tiên bạn cần nhập nó từ toán tử. Sau đó, bạn có thể sử dụng chức năng với bất kỳ đối tượng hoặc biểu thức Python nào làm đối số.Kết quả giống như sử dụng một biểu thức không tương đương.Lưu ý: Python cũng có các hàm AND_ () và or_ ().you first need to import it from operator . Then you can use the function with any Python object or expression as an argument. The result is the same as using an equivalent not expression. Note: Python also has and_() and or_() functions.

Làm thế nào để bạn kiểm tra xem một câu lệnh là sai trong Python?

Bạn có thể kiểm tra xem một giá trị có phải là sự thật hay giả với hàm bool () tích hợp không.Theo tài liệu Python, hàm này: Trả về giá trị boolean, tức là một trong những đúng hoặc sai.with the built-in bool() function. According to the Python Documentation, this function: Returns a Boolean value, i.e. one of True or False .