# Tic-Tac-Toe game in Python 3

I have written a code for a tic-tac-toe game and it works well. But, I don't know whether it is an efficient one. Any help on how to optimize it?

def restart():

num=[0 for i in range(9)]
board=[" " for i in range(9)]
a=2
start(board,a,num)

def wincheck(t):

for i in range(8):
if t[win[i][0]]==t[win[i][1]] and t[win[i][0]]==t[win[i][2]] and
t[win[i][1]]==t[win[i][2]] and t[win[i][0]]!=" ":
if t[win[i][0]]=="X":
print("Player 1 wins")
else:
print("Player 2 wins")
playa = input("Do you want to play again? Y/N")
if playa.lower() == "y":
restart()
else:
exit(0)
def display_board(t,a,num):

print( " "*3+'|'+" "*3+'|'+" "*3)
print("{0:^3}|{1:^3}|{2:^3}".format(t[6],t[7],t[8]))
print( " "*3+'|'+" "*3+'|'+" "*3)
print("-"*11)
print( " "*3+'|'+" "*3+'|'+" "*3)
print("{0:^3}|{1:^3}|{2:^3}".format(t[3],t[4],t[5]))
print( " "*3+'|'+" "*3+'|'+" "*3)
print("-"*11)
print( " "*3+'|'+" "*3+'|'+" "*3)
print("{0:^3}|{1:^3}|{2:^3}".format(t[0],t[1],t[2]))
print( " "*3+'|'+" "*3+'|'+" "*3)
wincheck(t)
if 0 not in num:
print("Draw")
restart()
start(t,a,num)

def start(board,a,num):

if a%2==0:
p1n=int(input("Player 1, Enter a number from 1 to 9"))
if p1n not in num:
num[p1n-1]=p1n
print(num)
else:
print("Please enter in a free space")
start(board,a,num)
board[p1n-1]="X"
a=a+1
display_board(board,a,num)
else:
p2n=int(input("Player 2, Enter a number from 1 to 9"))
if p2n not in num:
num[p2n-1]=p2n
print(num)
else:
print("Please enter in a free space")
start(board,a,num)
board[p2n-1]="O"
a=a+1
display_board(board,a,num)

a=2

board=[" " for i in range(9)]

num=[0 for i in range(9)]

win = [[0,1,2],[3,4,5],[6,7,8],[0,4,8],[6,4,2],[6,3,0],[7,4,1],[8,5,2]]

start(board,a,num)


Any help on how to optimize it?

Optimise readability, starting with following the Style Guide for Python Code.
(And yes, this is a useful step in optimising efficiency, too)

(The below reads an ill-tempered diatribe more than a code review, the sole exculpation being the explicit question in the title. (I should look for a well-receives SE resource bound to exist.))

How to write efficient source code for …?
Given a specification that looks ready for implementation,
- write tests shedding a light on correctness.
- fix(!) a limit for the effort to improve efficiency
- define a measure for efficient
(-if applicable, define relevant input data)
- automate measuring efficiency - memory usage is harder to assess than time used
(use available tools - timeit, for starters)
(It saves a lot of trouble to include (basic) functional tests here)
(Don't believe sub-second measurements.
Measure work completed in a fixed amount of time, not time used for a fixed amount of work.)
- use your first working version to establish a base line
- fix(!) what performance is good enough
- pick alternative implementations, jot down your guesses re. efficiency, measure
- time allowing (see limit above), experiment with improvements